队列作业未保存到租户数据库并且未使用租户SMTP



我有一个多租户设置,允许每个租户将自己的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'));
}
}

发送电子邮件作业

查看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);
}
}

也许不是最干净的方法,但我在发送作业时通过在电子邮件控制器中传递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工作中,我只在ConnectEmail中包含$smtp,并将其传递给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信息发送作业,而不会出现问题。

最新更新