Mail facade, but may require adaptation for Laravel’s service container and routing.Mail facade already supports transports via .env config; this bundle adds Symfony’s Mailer library (e.g., Message objects, Transport interfaces) which may offer finer-grained control (e.g., raw message manipulation, async retries).EventDispatcher integration could complement Laravel’s events system but may require bridging.Mail facade with Symfony’s MailerInterface for unified transport handling.Message class for advanced headers/attachments (e.g., EmbeddedImage, RawMessage).AsyncMailer for background jobs (though Laravel’s queues may suffice).MailerEvents (e.g., sent, failed) can integrate with Laravel’s event system but may need custom listeners.Mailer, Transport) may need manual binding or a custom bridge.Mailer is HTTP-agnostic; Laravel’s Mail facade ties to HTTP requests (e.g., Mail::send()). Async mail may require Laravel’s queues.DIC-based config (e.g., mailer.transport.dsn) vs. Laravel’s .env may need unification.| Risk Area | Severity | Mitigation Strategy |
|---|---|---|
| Container Conflicts | High | Abstract Symfony services via Laravel’s bind() or a facade. |
| Event System Gaps | Medium | Create Laravel event listeners for Symfony’s MailerEvents. |
| Async Mail Overhead | Low | Use Laravel queues for async; bundle’s AsyncMailer as fallback. |
| Testing Complexity | Medium | Mock Symfony’s Transport interface in PHPUnit. |
| Deprecation Risk | Low | Bundle depends on Symfony Mailer (stable); Laravel’s Mail is mature. |
Why Symfony’s Mailer over Laravel’s built-in?
HttpClient for API-based transports?Async Mail Strategy:
AsyncMailer required?Event Handling:
MailerEvents (e.g., message.sent) integrate with Laravel’s event system?Configuration Overhead:
.env configs (e.g., MAIL_MAILER=smtp) coexist with Symfony’s config/packages/mailer.yaml?Performance Impact:
Mail class?Mail facade with a custom facade wrapping Symfony’s MailerInterface..env for SMTP/SendGrid/Mailgun, but leverage Symfony’s Transport interface for custom transports (e.g., AWS SES).MailerEvents to Laravel’s Event system via listeners.symfony/mailer (v5.4+) and symfony/http-client (for API transports).swiftmailer (if used) by ensuring only one mail library is active.Phase 1: Core Integration
composer require cleentfaar/mailer-bundle symfony/mailer symfony/http-client
config/packages/mailer.yaml (Symfony-style) alongside Laravel’s .env.// app/Facades/Mailer.php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Mailer extends Facade { protected static function getFacadeAccessor() { return 'symfony.mailer'; } }
MailerInterface in Laravel’s service provider:
$this->app->bind('symfony.mailer', function ($app) {
return new \Symfony\Component\Mailer\Mailer(
new \Symfony\Component\Mailer\Transport\DsnTransport('default'),
$app['config']['mailer']
);
});
Phase 2: Feature Adoption
Mail::raw() with Mailer::send(new Message()).AsyncMailer if needed.MailerEvents:
event(new \Symfony\Component\Mailer\Event\MessageSentEvent($message));
Phase 3: Deprecation
Mail::send() calls with Mailer::send().Mail facade in favor of the custom Mailer facade.spatie/laravel-mail or other mail bundles to prevent duplicate services.swiftmailer/swiftmailer if both are loaded (Symfony’s Mailer uses symfony/mailer).Mail::send()/Mail::raw() calls..env mail configs align with Symfony’s mailer.yaml.Mail and Mailer facades during transition.swiftmailer dependencies.Message objects.mailer.yaml + .env).Transport interface..env (Laravel) and mailer.yaml (Symfony).Mailer library updates (e.g., breaking changes in v6.x).Message class and Transport interfaces.Mailer documentation.Mailer is stable, and Laravel’s Mail can be restored if needed.Mailer is optimized for bulk mail (e.g., batching, connection pooling).Message objects vs. Laravel’s simple Mailable classes.AsyncMailer scales well.MailerEvents with Laravel’s logging/monitoring (e.g., Sentry, Datadog):
$mailer->addEventListener(M
How can I help you explore Laravel packages today?