smtpfast/smtpfast-laravel
SMTPFast for Laravel integrates the SMTPFast sending service with Laravel's built-in mail system, adding a ready-made transport and simple configuration so you can send transactional email from any Laravel application.
Architecture fit
MAIL_MAILER=smtpfast means it should hook into Laravel's MailManager so existing Mailables, Notifications, and Mail::to() calls resolve to the SMTPfast transport without touching application code. That is the lowest-friction shape a mail integration can take in Laravel and fits current architecture with no refactoring.Integration feasibility
SMTPFAST_API_KEY, and egress allowlisting if outbound traffic is restricted.Technical risk
Key questions
MailManager, or a mailers entry pointing at a transport class? Does it survive config:cache?Reply-To, tags/metadata, Return-Path and Message-ID preservation, per-message size limits.Mail::fake() and assertSent still behave in tests, and is there a way to assert against SMTPfast-specific payloads?Stack fit
smtp, ses, postmark, or resend. The package's value proposition is a config-only swap, so it competes directly with the incumbent mailer rather than sitting alongside it.Mail::mailer() selection and per-mailer config arrays, not just global env.Migration path
config/mail.php and add smtpfast as an additional mailer so rollback is a one-line env change plus a config cache clear.Compatibility
^12.0 vs ^12.0|^13.0). Confirm composer why-not is clean in the real lockfile, not a scratch project.laravel/horizon retry semantics, and testing helpers.Sequencing
Mail::fake() and existing mail assertions still pass.Maintenance
0.1.0, subscribe to releases, and assign a named owner to review each one. Expect churn in config keys, the transport contract, and the bundled client.Support
Scaling
Failure modes
SMTPFAST_API_KEY expiry or rotation → 401s across all mail. Put the key in the secret manager at creation, not as a hand-edited env on one host, and know the rotation runbook before the first rotation.config:clear in the rollback runbook.Ramp-up
How can I help you explore Laravel packages today?