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

时间:2020-10-14 17:10:03

标签: laravel multi-tenant laravel-5.8

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

1 个答案:

答案 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信息发送作业,而不会出现问题。