我有一个多租户设置,允许每个租户将自己的SMTP信息保存在设置表中。现在正在保存的作业将被发送到系统数据库,而不是租户。由于设置了服务提供程序以将boot()上的邮件配置配置为数据库中每个提供的值,因此这引起了问题。当工作人员运行时,电子邮件作业确实发送但使用存储的系统SMTP值而不是租户-我认为这只是因为它与当前作业的连接在同一数据库中查找。
服务提供商
class TenantEmail extends ServiceProvider
{
/**
* Bootstrap services.
*
* @return void
*/
public function boot()
{
//
Config::set('mail.host', setting('admin.email_host'));
Config::set('mail.port', setting('admin.email_port'));
Config::set('mail.encryption', setting('admin.email_encrypt'));
Config::set('mail.username', setting('admin.email_username'));
Config::set('mail.password', setting('admin.email_password'));
}
}
发送电子邮件作业
在documentation on Hyn上查找,看来我可以在分发期间强制设置租户网站ID,但这没什么作用。
class SendEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $user;
public $sub;
public $content;
public $unsubscribeUrl;
public $replyAddress;
public $website_id;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct($row, $subject, $message, $unsubscribeUrl, $replyTo,int $website_id)
{
//
$this->user = $row;
$this->sub = $subject;
$this->content = $message;
$this->unsubscribeUrl = $unsubscribeUrl;
$this->replyAddress = $replyTo;
$this->website_id = $website_id;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
//
$email = new ConnectEmail($this->user, $this->sub, $this->content, $this->unsubscribeUrl, $this->replyAddress);
Mail::to($this->user->email_address, $this->user->name)->send($email);
}
}
答案 0 :(得分:0)
也许不是最干净的方法,但是我可以通过在分派作业时在我的电子邮件控制器中传递SMTP信息来解决此问题。
$smtp = [
'host' => setting('admin.email_host'),
'port' => setting('admin.email_port'),
'encryption' => setting('admin.email_encrypt'),
'username' => setting('admin.email_username'),
'password' => setting('admin.email_password')
];
$emailJob = (new SendEmail($row, $subject, $message, $unsubscribeUrl, $replyTo, $websiteId, $smtp));
dispatch($emailJob)->delay($scheduleSend);
然后在我的SendEmail作业中,我只将$ smtp包含在ConnectEmail中,并将其传递给mailable,我将其添加到init构造中:
if(!empty($smtp)){
Config::set('mail.host', $smtp['host']);
Config::set('mail.port', $smtp['port']);
Config::set('mail.encryption', $smtp['encryption']);
Config::set('mail.username', $smtp['username']);
Config::set('mail.password', $smtp['password']);
}
然后排队,并使用动态SMTP信息发送作业,而不会出现问题。