symfony/sendgrid-mailer
Symfony Mailer bridge for SendGrid. Configure SMTP or API transport via DSN, choose region, handle event webhooks with optional signature validation, set suppression group headers, and schedule sends (API) using a Send-At date header.
Pros:
Mailer, Mime, RemoteEvent), reducing friction for teams already using Symfony’s ecosystem.MAILER_DSN configuration.Cons:
Mailer component may complicate adoption in Laravel projects using non-Symfony mailers (e.g., custom SwiftMailer setups).AsRemoteEventConsumer attribute), requiring Laravel teams to bridge gaps (e.g., using symfony/remote-event via Composer).Send-At) are API-exclusive, necessitating a sendgrid+api DSN (not SMTP).Laravel Compatibility:
illuminate/mail uses Symfony’s Mailer under the hood, so this package integrates out-of-the-box with Laravel’s Mail facade.// Laravel config/mail.php
'default' => env('MAIL_MAILER', 'sendgrid'),
'sendgrid' => [
'transport' => env('MAILER_DSN', 'sendgrid+api://KEY@default?region=us'),
];
sent, failed) may need mapping to Symfony’s MailerDeliveryEvent for webhook use cases.RemoteEvent components if using webhooks (e.g., SendgridRequestParser).Migration Path:
smtp, log) with sendgrid+smtp/sendgrid+api in MAILER_DSN.Critical Risks:
database, redis) may need buffering.region in MAILER_DSN may cause latency or compliance issues (e.g., GDPR data residency).Mitigation Strategies:
secret in SendgridRequestParser).queue:failed table to reprocess failed webhook events.Open Questions:
SwiftMailer vs. Symfony Mailer differences)?Core Components:
| Laravel Feature | Symfony/SendGrid Integration | Notes |
|---|---|---|
Mail::send() |
symfony/mailer + sendgrid+api DSN |
Direct replacement. |
| Queue-based emails | Symfony Mailer + Laravel queues |
Use Mail::later() for scheduling. |
| Webhooks | SendgridRequestParser + AsRemoteEventConsumer |
Requires Symfony RemoteEvent setup. |
| GDPR Opt-outs | SuppressionGroupHeader |
Map to SendGrid suppression groups. |
| Email Templates | SendGrid’s Dynamic Templates (via API) | Use sendgrid+api for template IDs. |
| Analytics | SendGrid’s Event Tracking + Laravel logging | Webhook to database queue. |
Dependencies:
symfony/mailer (Laravel 9+ includes this via illuminate/mail).symfony/remote-event (for webhooks; install via Composer).sendgrid/sendgrid (direct SDK access for advanced use cases).Phase 1: Replace Mailer Transport
MAILER_DSN in .env:
MAIL_MAILER=sendgrid
MAILER_DSN=sendgrid+api://${SENDGRID_API_KEY}@default?region=us
Mail::raw() or Mail::markdown().sendgrid+smtp).Phase 2: Enable Webhooks (Optional)
routes/web.php:
use Symfony\Component\RemoteEvent\Routing\WebhookRouting;
WebhookRouting::add('sendgrid', 'mailer.webhook.request_parser.sendgrid');
#[AsRemoteEventConsumer(name: 'sendgrid')]
class SendGridConsumer implements ConsumerInterface {
public function consume(MailerDeliveryEvent $event) {
// Log to database or trigger retries.
}
}
symfony/remote-event via Composer and wrap in a Laravel service provider.Phase 3: Adopt SendGrid-Specific Features
$email->getHeaders()->add(new SuppressionGroupHeader('group123', ['group123']));
Mail::later() or Send-At header:
$email->getHeaders()->addDateHeader('Send-At', new DateTimeImmutable('+1 hour'));
symfony/mailer:^6.3 for compatibility.php-curl (for API transport) and php-openssl (for SMTP).MAIL_MAILER environment flag).How can I help you explore Laravel packages today?