| title | PHP SDK |
|---|---|
| description | Test email flows in PHPUnit, Pest and Laravel Dusk — OTPs and magic links auto-extracted. |
composer require --dev zerodrop/zerodropPHP 8.1+ · ext-curl · ext-json — no other dependencies.
use ZeroDrop\Client;
$mail = new Client();
$inbox = $mail->generateInbox();
// => "swift-x7k29ab@zerodrop-sandbox.online"
// Trigger your app's email flow with the inbox address...
$email = $mail->waitForLatest($inbox, timeout: 15);
$email->otp; // "123456" — auto-extracted, no regex
$email->magicLink; // "https://..." — auto-extracteduse Laravel\Dusk\Browser;
use ZeroDrop\Client;
public function testSignupEmailVerification(): void
{
$mail = new Client();
$inbox = $mail->generateInbox();
$this->browse(function (Browser $browser) use ($mail, $inbox) {
$browser->visit('/signup')
->type('email', $inbox)
->type('password', 'TestPassword123!')
->press('Create account');
$email = $mail->waitForLatest($inbox, timeout: 15);
$browser->type('otp', $email->otp)
->press('Verify')
->assertPathIs('/dashboard');
});
}use ZeroDrop\Client;
it('verifies the account via emailed OTP', function () {
$mail = new Client();
$inbox = $mail->generateInbox();
// Trigger signup with $inbox...
$email = $mail->waitForLatest($inbox, timeout: 15);
expect($email->otp)->not->toBeNull();
});use ZeroDrop\Filter;
$email = $mail->waitForLatest(
$inbox,
timeout: 15,
filter: new Filter(
from: 'noreply@yourapp.com',
hasOtp: true,
),
);All string filters are case-insensitive partial matches.
generateInbox() runs locally — safe with Paratest and parallel Dusk runs. Every call returns a unique isolated inbox.
use ZeroDrop\Exception\TimeoutException;
use ZeroDrop\Exception\AuthException;
use ZeroDrop\Exception\NetworkException;
try {
$email = $mail->waitForLatest($inbox, timeout: 15);
} catch (TimeoutException $e) {
// No email arrived
} catch (AuthException $e) {
// Invalid API key
} catch (NetworkException $e) {
// Transport failure
}$mail = new Client(
apiKey: getenv('ZERODROP_API_KEY'),
baseUrl: 'https://your-instance.yourdomain.com',
);