在运行时为用户更新配置

Updating config on runtime for a user

我正在使用 Laravel 5.1

我创建了一个函数来从数据库中为用户 $mail_config=STMPDetails::where('user_id',36)->first() 获取 smtp 信息,然后我可以调用 config 辅助函数并传递数组以设置配置值 config($mail_config)。然后我调用 Mail::queue 函数。

但在到达 createSmtpDriver@vendor/laravel/framework/src/Illuminate/Mail/TransportManager.php 之前再次读取配置以发送邮件,邮件配置已更改为 .env 文件中指定的配置。

另外需要注意的是Mail发送功能在一个Listener中

我不知道在哪里可以调用该函数,以便在发送邮件之前保留配置更改。

谢谢, K

由于默认的 MailServiceProvider 是 deferred provider,您应该能够在实际创建服务之前更改配置详细信息。

你能展示$mail_config的内容吗?我猜这就是问题所在。应该是这样的

config(['mail.port' => 587]);

更新 - 在 5.1 应用程序中测试:

Mail::queue('emails.hello', $data, function ($mail) use ($address) {
    $mail->to($address);
});

->> 正常发送给收件人。

config(['mail.driver' => 'log']);

Mail::queue('emails.hello', $data, function ($mail) use ($address) {
    $mail->to($address);
});   

->>未发送;已记录消息。

这应该有效:

// Set your new config
Config::set('mail.driver', $driver);
Config::set('mail.from', ['address' => $address, 'name' => $name]);

// Re execute the MailServiceProvider that should use your new config
(new Illuminate\Mail\MailServiceProvider(app()))->register();