我正在使用Laravel Mailable发送电子邮件,我想记录已成功发送的电子邮件。
Laravel Mailable在发送电子邮件后触发了默认事件
https://laravel.com/docs/5.6/mail#events
所以我把我的听众挂钩到这个事件
protected $listen = [
'App\Events\Event' => [
'App\Listeners\EventListener',
],
'Illuminate\Mail\Events\MessageSent' => [
'App\Listeners\LogSentEmailNotification',
],
];
侦听器处理程序
public function handle(MessageSent $event)
{
//get extra data
$job_request_id = $event->message->job_request_id;
$message = $event->message;
$data = [
'job_request_id' => $job_request_id,
'to' => $message->getHeaders()->get('To'),
'from' => $message->getHeaders()->get('From'),
'cc' => $message->getHeaders()->get('Cc'),
'bcc' => $message->getHeaders()->get('Bcc'),
'subject' => $message->getHeaders()->get('Subject')->getFieldBody(),
'body' => $message->getBody(),
];
$email_notification_log = $this->email_notification_log->create($data);
}
额外数据job_request_id从Mailable类的build()方法传递,CustomEmailNotification.php
class CustomEmailNotification extends Mailable implements ShouldQueue
{
public function build()
{
$job_request_id = 1;
//pass extra data mail message
$this->withSwiftMessage(function ($message) use($job_request_id){
$message->job_request_id = $job_request_id;
});
}
}
现在,Listener类上的这一行在没有队列的情况下正常工作,但是当使用队列时,它将返回null
//get extra data
$job_request_id = $event->message->job_request_id;
var_dump($job_request_id);
//null when using queue
问题是,使用队列时将自定义数据传递给MailSent事件的正确方法是什么?
或者是否有可能在使用队列并传递给withSwiftMessage()时丢失job_request_id,所以事件监听器刚收到空值?
由于
答案 0 :(得分:0)
如果您使用Supervisor作为队列工作程序。尝试重新启动所有进程。必须重新加载主管以反映代码中的最新更改。
sudo supervisorctl restart all
答案 1 :(得分:0)
也许这可以帮助您 https://medium.com/@guysmilez/queuing-mailables-with-custom-headers-in-laravel-5-4-ab615f022f17
根据这篇文章,当您将mailable放入队列时,变量会丢失,因此您必须重写Mailable的send方法
答案 2 :(得分:0)
该邮件中的任何public
属性都会保存到该事件的data
属性中。
class CustomEmailNotification extends Mailable implements ShouldQueue
{
public $job_request_id = 1;
}
现在在您的侦听器中,您可以将属性名称作为数组索引data
var_dump($event->data['job_request_id']);