arturbruno/laravel-mailgun-email-validation
Laravel validation rule that checks emails with PHP FILTER_VALIDATE_EMAIL then Mailgun’s Email Validation API. Supports role/disposable checks, mailbox verification, and strict mode to fail when Mailgun can’t be reached.
Installation
composer require arturbruno/laravel-mailgun-email-validation
Publish the config file:
php artisan vendor:publish --provider="ArturBruno\MailgunEmailValidation\MailgunEmailValidationServiceProvider"
Configuration
Update .env with your Mailgun API key and domain:
MAILGUN_API_KEY=your-api-key
MAILGUN_DOMAIN=your-domain.mailgun.org
First Use Case Validate an email in a Laravel form request:
use ArturBruno\MailgunEmailValidation\Rules\MailgunEmailValidation;
public function rules()
{
return [
'email' => ['required', new MailgunEmailValidation],
];
}
Form Validation Use the rule in Laravel's built-in validation:
$request->validate([
'email' => ['required', 'email', new MailgunEmailValidation],
]);
API Endpoints Validate emails in API responses:
$validator = Validator::make($request->all(), [
'email' => new MailgunEmailValidation,
]);
Custom Validation Logic Extend the rule for conditional checks:
$validator = Validator::make($data, [
'email' => function ($attribute, $value, $fail) {
if ($this->shouldValidateEmail($value)) {
$fail(new MailgunEmailValidation);
}
},
]);
Batch Validation Validate multiple emails in a loop:
foreach ($emails as $email) {
$validator = Validator::make(['email' => $email], [
'email' => new MailgunEmailValidation,
]);
if ($validator->fails()) {
// Handle failure
}
}
Async Validation Use queues to avoid blocking the user:
EmailValidationJob::dispatch($email);
Rate Limits Mailgun API has rate limits. Avoid excessive calls in loops without delays. Tip: Cache results for repeated validations.
API Key Exposure
Never expose MAILGUN_API_KEY in client-side code. Always validate server-side.
Domain Restrictions
The package validates against the configured MAILGUN_DOMAIN. Ensure this matches your use case.
Enable Logging Add debug logs to track API calls:
\Log::debug('Mailgun validation payload:', ['email' => $email]);
Mock API Calls For testing, mock the Mailgun client:
$this->mock(Mailgun::class, function ($mock) {
$mock->shouldReceive('validateEmail')->andReturn(true);
});
Custom Validation Steps
Extend the MailgunEmailValidator class to add custom checks:
class CustomMailgunValidator extends MailgunEmailValidator
{
public function validate($email)
{
$result = parent::validate($email);
// Add custom logic
return $result;
}
}
Override Default Config Modify the config file to adjust timeout, retries, or API endpoints:
'timeout' => 10, // seconds
'retries' => 3,
Event Listeners Listen for validation events to trigger side effects:
\Event::listen(MailgunEmailValidation::class, function ($email) {
// Log or notify on validation
});
How can I help you explore Laravel packages today?