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

Queue Job not saving to Tenant database and not using Tenant SMTP

我有一个多租户设置,允许每个租户在设置 table 中保存他们自己的 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);
    }
}

这可能不是最干净的方法,但我可以通过在发送作业时在我的电子邮件控制器中传递 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 中并将其传递给可邮寄对象,我只是在 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 信息排队并毫无问题地发送作业。