こんなよくあるシチュエーションが上手くいかずに苦悩したので備忘も兼ねて
Configオブジェクトの設定を書き換えて送信すればいいよね。
って思ったので
//foo@example.comアカウントで送信 Config::set('mail.username', 'foo@example.com'); Config::set('mail.password', 'barpass'); Mail::raw($body, function($message) { $message->to('dest@example.com'); $message->subject("test"); }); //bar@example.comアカウントで送信 Config::set('mail.username', 'bar@example.com'); Config::set('mail.password', 'barpass'); Mail::raw($body, function($message) { $message->to('dest@example.com'); $message->subject("test"); });
こんな感じに書いた。
ちなみに.envでは
MAIL_USERNAME=hoge@example.com
MAIL_PASSWORD=hogepass
としていた。
このコードを動かしてみると
1回目のメール送信はfoo@example.comアカウントでプログラムした通りに送信してくれる。
ところが、
2回目のメール送信もfoo@example.comアカウントでメール送信してしまう。
原因
この現象を御幣を恐れず簡単に説明すると。
Mailがstaticなので1回目の処理で作られたメールアカウント(transport)を持っていて
2回目はインスタンスがある為に新規にメールアカウント(transport)のインスタンスを作らずに
1回目のメールアカウント(transport)を引き継いで処理してしまう。
回避方法
何かメールアカウントをクリアする方法があるのかと調べましたが見つからず、
どうやらTransportのインスタンスを個別に作らないとだめらしい。
やり方を書いてくださっているページがあったのでリンクさせていただきます。
LaravelのMailで、機能ごとに送信元アドレスを切り替えたい(Gmailなど)時にめっちゃ詰まった話