我正在尝试为应用程序的每个用户使用不同的SMTP配置。因此,使用 Swift_SmtpTransport 设置一个新的传输实例,将其分配给Swift_Mailer,然后将其分配给 Laravel Mailer。
在完整摘要下方:
$transport = Swift_SmtpTransport::newInstance($mailConfig['smtp_host'], $mailConfig['smtp_port'], 'ssl');
$transport->setUsername($mailConfig['smtp_user']);
$transport->setPassword($mailConfig['smtp_pass']);
$smtp = new Swift_Mailer($transport);
Mail::setSwiftMailer($smtp);
Mail::queue(....);
消息将添加到队列中,但从不调度。我猜由于"真实"发送是异步的,它使用默认的SMTP配置,而不是Mail::queue()之前的传输集。
所以,问题是:使用 Mail::queue() 时如何更改邮件传输?
不要使用 Mail::queue
,请尝试创建一个处理发送电子邮件的队列作业类。这样,传输交换代码将在处理作业时执行。
作业类结构文档实际上使用邮件场景作为示例,该场景接收您可以操作的Mailer
实例。只需在类的 handle
方法中使用您的代码:
public function handle(Mailer $mailer)
{
$transport = Swift_SmtpTransport::newInstance($mailConfig['smtp_host'], $mailConfig['smtp_port'], 'ssl');
$transport->setUsername($mailConfig['smtp_user']);
$transport->setPassword($mailConfig['smtp_pass']);
$smtp = new Swift_Mailer($transport);
$mailer->setSwiftMailer($smtp);
$mailer->send('viewname', ['data'], function ($m) {
//
});
}
自Laravel 7以来最好的通知方式:https://laravel.com/docs/9.x/notifications#customizing-the-mailer
public function toMail($notifiable)
{
return (new MailMessage)
->mailer('postmark')
->line('...');
}
我正在做一个测试,我需要 300 个不同的邮件(来填充 Mailtrap Enterprise),所以有 300 个不同的配置对我来说并不好。我正在发布我在Illuminate\Mail\Mailer类中找到的简单解决方案
$transport = Transport::fromDsn('smtp://user:pass@host:port');
Mail::setSymfonyTransport($transport);
Mail::to('to@email.com')
->send((new LaravelMail())
->subject('Subject')
);
有了这个,您可以执行一些字符串操作以在传输配置之间切换