EmailVerify LogoEmailVerify

PHP

PHP email checker SDK. Composer install, verify emails with PHP. Code examples included.

공식 EmailVerify PHP SDK는 Laravel 지원과 함께 이메일 검증을 위한 사용하기 쉬운 인터페이스를 제공합니다.

설치

composer require emailverify/php-sdk

요구 사항

  • PHP 8.0 이상
  • Composer
  • JSON 확장
  • cURL 확장

빠른 시작

<?php

use EmailVerify\Client;

$client = new Client(getenv('EMAILVERIFY_API_KEY'));

$result = $client->verify('user@example.com');
echo "Status: " . $result->status . "\n";
echo "Score: " . $result->score . "\n";

구성

클라이언트 옵션

$client = new Client(
    apiKey: getenv('EMAILVERIFY_API_KEY'),
    options: [
        'timeout' => 30,           // Request timeout in seconds
        'retries' => 3,            // Number of retry attempts
        'base_url' => 'https://api.emailverify.ai',
    ]
);

환경 구성

# .env
EMAILVERIFY_API_KEY=your_api_key_here

단일 검증

기본 검증

$result = $client->verify('user@example.com');

echo "Email: " . $result->email . "\n";
echo "Status: " . $result->status . "\n";
echo "Score: " . $result->score . "\n";
echo "Deliverable: " . ($result->result->deliverable ? 'Yes' : 'No') . "\n";
echo "Disposable: " . ($result->result->disposable ? 'Yes' : 'No') . "\n";

옵션을 사용한 검증

$result = $client->verify('user@example.com', [
    'smtp_check' => true,
    'timeout' => 5,
]);

응답 구조

class VerificationResult {
    public string $email;
    public string $status;        // 'valid', 'invalid', 'unknown', 'accept_all'
    public ResultDetails $result;
    public float $score;
    public ?string $reason;
}

class ResultDetails {
    public ?bool $deliverable;
    public bool $valid_format;
    public bool $valid_domain;
    public bool $valid_mx;
    public bool $disposable;
    public bool $role;
    public bool $catchall;
    public bool $free;
    public ?bool $smtp_valid;
}

대량 검증

작업 제출

$emails = [
    'user1@example.com',
    'user2@example.com',
    'user3@example.com',
];

$job = $client->verifyBulk($emails);
echo "Job ID: " . $job->id . "\n";

상태 확인

$status = $client->getBulkJobStatus($job->id);

echo "Status: " . $status->status . "\n";
echo "Progress: " . $status->processed . "/" . $status->total . "\n";
echo "Valid: " . $status->valid . "\n";
echo "Invalid: " . $status->invalid . "\n";

결과 가져오기

$results = $client->getBulkJobResults($job->id);

foreach ($results as $result) {
    echo $result->email . ": " . $result->status . "\n";
}

웹훅 사용

$job = $client->verifyBulk($emails, [
    'webhook_url' => 'https://your-domain.com/webhooks/emailverify',
]);

크레딧 관리

$credits = $client->getCredits();

echo "Available: " . $credits->available . "\n";
echo "Used: " . $credits->used . "\n";
echo "Total: " . $credits->total . "\n";

오류 처리

예외 유형

use EmailVerify\Client;
use EmailVerify\Exceptions\AuthenticationException;
use EmailVerify\Exceptions\RateLimitException;
use EmailVerify\Exceptions\ValidationException;
use EmailVerify\Exceptions\EmailVerifyException;

try {
    $result = $client->verify('invalid-email');
} catch (AuthenticationException $e) {
    echo "Invalid API key\n";
} catch (RateLimitException $e) {
    echo "Rate limited. Retry after " . $e->getRetryAfter() . " seconds\n";
} catch (ValidationException $e) {
    echo "Invalid input: " . $e->getMessage() . "\n";
} catch (EmailVerifyException $e) {
    echo "API error: " . $e->getMessage() . "\n";
}

Laravel 통합

서비스 프로바이더

Laravel 5.5 이상에서는 패키지가 자동으로 발견됩니다. 이전 버전의 경우 config/app.php에 추가하세요:

'providers' => [
    EmailVerify\Laravel\EmailVerifyServiceProvider::class,
],

'aliases' => [
    'EmailVerify' => EmailVerify\Laravel\Facades\EmailVerify::class,
],

구성

설정 파일을 게시하세요:

php artisan vendor:publish --provider="EmailVerify\Laravel\EmailVerifyServiceProvider"

설정 파일 (config/emailverify.php):

<?php

return [
    'api_key' => env('EMAILVERIFY_API_KEY'),
    'timeout' => env('EMAILVERIFY_TIMEOUT', 30),
    'retries' => env('EMAILVERIFY_RETRIES', 3),
];

파사드 사용

use EmailVerify\Laravel\Facades\EmailVerify;

// Single verification
$result = EmailVerify::verify('user@example.com');

// Bulk verification
$job = EmailVerify::verifyBulk($emails);

// Check credits
$credits = EmailVerify::getCredits();

의존성 주입

use EmailVerify\Client;

class UserController extends Controller
{
    public function __construct(
        private Client $emailVerify
    ) {}

    public function register(Request $request)
    {
        $result = $this->emailVerify->verify($request->email);

        if ($result->status === 'invalid') {
            return back()->withErrors(['email' => 'Invalid email address']);
        }

        // Continue registration...
    }
}

유효성 검사 규칙

use EmailVerify\Laravel\Rules\ValidEmail;

$request->validate([
    'email' => ['required', 'email', new ValidEmail()],
]);

옵션이 있는 사용자 정의 규칙:

use EmailVerify\Laravel\Rules\ValidEmail;

$request->validate([
    'email' => [
        'required',
        'email',
        new ValidEmail([
            'reject_disposable' => true,
            'reject_role' => false,
            'min_score' => 0.7,
        ]),
    ],
]);

폼 리퀘스트

<?php

namespace App\Http\Requests;

use EmailVerify\Laravel\Rules\ValidEmail;
use Illuminate\Foundation\Http\FormRequest;

class RegisterRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'name' => ['required', 'string', 'max:255'],
            'email' => [
                'required',
                'email',
                'unique:users',
                new ValidEmail([
                    'reject_disposable' => true,
                ]),
            ],
            'password' => ['required', 'min:8', 'confirmed'],
        ];
    }

    public function messages(): array
    {
        return [
            'email.valid_email' => 'Please provide a valid email address.',
        ];
    }
}

큐 검증

<?php

namespace App\Jobs;

use EmailVerify\Client;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

class VerifyUserEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct(
        private int $userId,
        private string $email
    ) {}

    public function handle(Client $client): void
    {
        $result = $client->verify($this->email);

        \App\Models\User::where('id', $this->userId)->update([
            'email_verified' => $result->status === 'valid',
            'email_score' => $result->score,
            'email_disposable' => $result->result->disposable,
        ]);
    }
}

// Dispatch
VerifyUserEmail::dispatch($user->id, $user->email);

미들웨어

<?php

namespace App\Http\Middleware;

use EmailVerify\Client;
use Closure;
use Illuminate\Http\Request;

class VerifyEmailMiddleware
{
    public function __construct(
        private Client $client
    ) {}

    public function handle(Request $request, Closure $next)
    {
        if ($request->has('email')) {
            $result = $this->client->verify($request->email);

            if ($result->status === 'invalid') {
                return response()->json([
                    'error' => 'Invalid email address'
                ], 422);
            }

            if ($result->result->disposable) {
                return response()->json([
                    'error' => 'Disposable emails are not allowed'
                ], 422);
            }
        }

        return $next($request);
    }
}

완전한 예시

등록 유효성 검사

<?php

use EmailVerify\Client;

class EmailValidator
{
    public function __construct(
        private Client $client
    ) {}

    public function validateForRegistration(string $email): array
    {
        $result = $this->client->verify($email);

        // Reject invalid emails
        if ($result->status === 'invalid') {
            return [
                'valid' => false,
                'reason' => 'invalid_email',
                'message' => 'This email address is invalid',
            ];
        }

        // Reject disposable emails
        if ($result->result->disposable) {
            return [
                'valid' => false,
                'reason' => 'disposable',
                'message' => 'Please use a permanent email address',
            ];
        }

        // Warn about role-based emails
        if ($result->result->role) {
            return [
                'valid' => true,
                'warning' => 'role_based',
                'message' => 'Using a personal email is recommended',
            ];
        }

        return [
            'valid' => true,
            'score' => $result->score,
        ];
    }
}

// Usage
$validator = new EmailValidator($client);
$validation = $validator->validateForRegistration('user@example.com');

if (!$validation['valid']) {
    echo $validation['message'];
}

대량 목록 정리

<?php

use EmailVerify\Client;

class ListCleaner
{
    public function __construct(
        private Client $client
    ) {}

    public function cleanList(array $emails): array
    {
        // Submit bulk job
        $job = $this->client->verifyBulk($emails);

        // Poll for completion
        while (true) {
            $status = $this->client->getBulkJobStatus($job->id);

            if ($status->status === 'completed') {
                break;
            }

            if ($status->status === 'failed') {
                throw new \Exception('Bulk job failed');
            }

            sleep(5);
        }

        // Get and categorize results
        $results = $this->client->getBulkJobResults($job->id);

        $valid = [];
        $invalid = [];
        $risky = [];

        foreach ($results as $result) {
            if ($result->status === 'invalid') {
                $invalid[] = $result->email;
            } elseif ($result->result->disposable || $result->result->role) {
                $risky[] = $result->email;
            } else {
                $valid[] = $result->email;
            }
        }

        return [
            'valid' => $valid,
            'invalid' => $invalid,
            'risky' => $risky,
            'stats' => [
                'total' => count($emails),
                'valid_count' => count($valid),
                'invalid_count' => count($invalid),
                'risky_count' => count($risky),
            ],
        ];
    }
}

API 엔드포인트

<?php
// api/verify.php

header('Content-Type: application/json');

use EmailVerify\Client;

$client = new Client(getenv('EMAILVERIFY_API_KEY'));

if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    http_response_code(405);
    echo json_encode(['error' => 'Method not allowed']);
    exit;
}

$input = json_decode(file_get_contents('php://input'), true);
$email = $input['email'] ?? null;

if (!$email) {
    http_response_code(400);
    echo json_encode(['error' => 'Email is required']);
    exit;
}

try {
    $result = $client->verify($email);
    echo json_encode([
        'email' => $result->email,
        'status' => $result->status,
        'score' => $result->score,
        'deliverable' => $result->result->deliverable,
    ]);
} catch (\Exception $e) {
    http_response_code(500);
    echo json_encode(['error' => 'Verification failed']);
}

모범 사례

1. 결과 캐시

use Illuminate\Support\Facades\Cache;

function verifyWithCache(Client $client, string $email): VerificationResult
{
    $cacheKey = 'email_verification_' . md5($email);

    return Cache::remember($cacheKey, 3600, function () use ($client, $email) {
        return $client->verify($email);
    });
}

2. 오류를 우아하게 처리

function safeVerify(Client $client, string $email): ?VerificationResult
{
    try {
        return $client->verify($email);
    } catch (RateLimitException $e) {
        Log::warning('Rate limited', ['retry_after' => $e->getRetryAfter()]);
        return null;
    } catch (EmailVerifyException $e) {
        Log::error('Verification failed', ['error' => $e->getMessage()]);
        return null;
    }
}

다음 단계

On this page