はじめに
とあるシステムで外部メールサーバと社内メールサーバを切り分けて利用するケースがありましたので、備忘録がてら記載します。
FWというか通常のシステムでも複数メールサーバの切り分けはあんまりやらない気がするので、需要は薄いと思いますが・・・
やること
以下のメール設定値をオーバーライドして、メール送信時の設定を切り替える。
1. 環境設定値の追加
.env
MAIL_MAILER=smtp
MAIL_HOST=mailhog
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
+ CUSTOM_MAIL_HOST=mailhog
+ CUSTOM_MAIL_PORT=1025
+ CUSTOM_MAIL_USERNAME=null
+ CUSTOM_MAIL_PASSWORD=null
+ CUSTOM_MAIL_ENCRYPTION=null
+ CUSTOM_MAIL_FROM_ADDRESS="hello@example.com"
+ CUSTOM_MAIL_FROM_NAME="${APP_NAME}"
2. 環境設定値を参照するメール設定値の追加
mail.php
'mailers' => [
'smtp' => [
'transport' => 'smtp',
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'port' => env('MAIL_PORT', 587),
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME'),
'password' => env('MAIL_PASSWORD'),
'timeout' => null,
'local_domain' => env('MAIL_EHLO_DOMAIN'),
+ 'custom' => [
+ 'transport' => 'smtp',
+ 'host' => env('CUSTOM_MAIL_HOST', 'smtp.mailgun.org'),
+ 'port' => env('CUSTOM_MAIL_PORT', 587),
+ 'encryption' => env('CUSTOM_MAIL_ENCRYPTION', 'tls'),
+ 'username' => env('CUSTOM_MAIL_USERNAME'),
+ 'password' => env('CUSTOM_MAIL_PASSWORD'),
+ 'timeout' => null,
+ 'local_domain' => env('CUSTOM_MAIL_EHLO_DOMAIN'),
],
3. メール送信の実装
設定値をもとに戻さないと変更がそのまま引き継がれます。
+ // ↓設定一時変更
+ config(['mail.default' => 'custom']);
// メール送信
+ // ↓設定初期化
+ config(['mail.default' => 'smtp']);
4. 例外時にもメール設定値を戻す
ここでも戻さないと、例外時にメール送信をしていた場合は、別の設定で送信されてしまいます。
Handler.php
public function report(Exception $exception)
{
+ // ↓設定初期化
+ config(['mail.default' => 'smtp']);
注意事項
設定変更は、オーバーライドしたままになるため、設定値をもとに戻す必要があります。
例えば、もとに戻さない状態だと、後続処理のメール送信設定や、エラー発生時の送信設定が意図しないもので動作してしまいます。