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.
## Getting Started
Install via Composer:
```bash
composer require lacodix/laravel-scoped-mail-config
Publish the package config (optional):
php artisan vendor:publish --provider="Lacodix\ScopedMailConfig\ScopedMailConfigServiceProvider" --tag="config"
First Use Case: Define scoped mail configurations in config/mail.php under the scopes key:
'scopes' => [
'newsletter' => [
'driver' => 'ses',
'from' => ['address' => 'newsletter@example.com', 'name' => 'Newsletter'],
],
'support' => [
'driver' => 'mailgun',
'from' => ['address' => 'support@example.com', 'name' => 'Support Team'],
],
],
Use the facade to dynamically switch scopes:
use Lacodix\ScopedMailConfig\Facades\ScopedMailConfig;
// Set scope for current request
ScopedMailConfig::setScope('newsletter');
// Mail will now use the 'newsletter' configuration
Mail::to('user@example.com')->send(new Newsletter());
Leverage middleware to auto-set scopes based on request context (e.g., route, user role):
// app/Http/Middleware/SetMailScope.php
public function handle(Request $request, Closure $next) {
if ($request->is('newsletter/*')) {
ScopedMailConfig::setScope('newsletter');
}
return $next($request);
}
Register in app/Http/Kernel.php:
protected $middlewareGroups = [
'web' => [
// ...
\App\Http\Middleware\SetMailScope::class,
],
];
Use closures for runtime logic:
ScopedMailConfig::setScope(function (Request $request) {
return $request->user()->isPremium() ? 'premium' : 'standard';
});
Define a default scope in config/mail.php:
'scopes' => [
'default' => [...],
// ...
],
Then use:
ScopedMailConfig::setScope('default'); // Fallback if scope not found
For Laravel 12 projects, the package now drops Laravel Insights compatibility (removed in v1.2.0). Ensure your composer.json includes:
"require": {
"laravel/framework": "^12.0"
}
If a scope isn’t defined, the package throws InvalidArgumentException. Validate scopes exist before use:
if (ScopedMailConfig::hasScope('newsletter')) {
ScopedMailConfig::setScope('newsletter');
}
Scopes do not merge with global mail.php settings. Explicitly define all required keys (e.g., driver, from) in each scope.
Mock the facade in tests:
$mock = Mockery::mock('overload', Lacodix\ScopedMailConfig\Facades\ScopedMailConfig::class);
$mock->shouldReceive('getScope')->andReturn('test-scope');
Avoid setting scopes in every request if unnecessary. Cache the scope for static contexts (e.g., CLI commands):
// In a command
ScopedMailConfig::setScope('cli-notifications');
v1.1.0 or refactor Insights-related logic.Lacodix\ScopedMailConfig\Contracts\ScopeResolver for advanced logic (e.g., database-backed scopes).ScopedMailConfig.ScopeSet events for side effects (e.g., logging).
---
**NO_UPDATE_NEEDED** for prior assessments (this is a new package). The above is the **full updated assessment** for `v1.2.0`.
How can I help you explore Laravel packages today?