队列作业未保存到租户数据库且未使用租户 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 信息排队并毫无问题地发送作业。
我有一个多租户设置,允许每个租户在设置 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 信息排队并毫无问题地发送作业。