lacodix/laravel-scoped-mail-config
Send emails with dynamic, per-scope mailer settings in Laravel. Provide SMTP/from config via any model or class implementing HasMailConfig—ideal for multi-tenancy (e.g., Spatie) or user/team-specific mail configurations.
Architecture Fit The package excels in multi-tenant Laravel applications where dynamic mail configurations (e.g., tenant-specific SMTP/API keys) are required. It leverages Laravel’s service container and facade pattern, ensuring seamless integration with existing mail systems. The design adheres to Laravel’s convention over configuration philosophy, reducing boilerplate while maintaining flexibility. Key strengths include:
HasMailConfig interface, avoiding global overrides.ScopedMail extends Laravel’s native Mail facade, preserving all existing functionality (e.g., queues, notifications).Integration Feasibility
Technical Risk
config:cache if not explicitly handled (test in production-like environments).Key Questions
Stack Fit
Mail facade, preserving all features (queues, notifications, events).config/app.php, requiring minimal setup.config/mail.php with scoped overrides, enabling gradual adoption.Migration Path
config/mail.php and related service providers.composer require lacodix/laravel-scoped-mail-config
php artisan vendor:publish --provider="Lacodix\ScopedMailConfig\ScopedMailConfigServiceProvider"
HasMailConfig in your tenant/user model:
class Tenant implements HasMailConfig {
public function getMailConfig($name): array { ... }
}
AppServiceProvider:
ScopedMail::resolveScopeUsing(fn () => Tenant::getCurrentTenant());
ScopedMail instead of Mail:
ScopedMail::to($email)->send(new OrderShipped($order));
config:cache and queue workers.Compatibility
Sequencing
Maintenance
config/scoped-mail.php.Support
FUNDING.yml suggests community support.ScopedMail::getScopes() to inspect active configs.ScopedMail::fake() for test isolation.mail.php backup for rollback.Scaling
queue:work to ensure scoped configs persist across workers.Failure Modes
| Scenario | Impact | Mitigation Strategy |
|---|---|---|
| Missing scope | Falls back to global config | Validate scopes in middleware; log warnings. |
| Database timeout (dynamic scopes) | Mail delivery fails | Implement retry logic; cache scopes. |
| Config caching conflicts | Scoped configs not applied | Exclude scoped-mail.php from config:cache or use runtime overrides. |
| Tenant resolution failure | No scope resolved | Add fallback to global config in resolver. |
| SMTP/API key errors | Mail delivery fails | Use Laravel’s Mail::fail() events for alerts. |
| Queue worker crashes | Pending mails lost | Monitor queue jobs; implement dead-letter queues. |
Ramp-Up
HasMailConfig to a model").How can I help you explore Laravel packages today?