我在我的 laravel 应用程序中使用 Mailgun 作为邮件驱动程序,以及用于 SMS 目的的 nexmo。
我想要实现的是维护通过 Mailgun 或 Nexmo 发送的通知的传递状态。在 Nexmo 的情况下,我能够实现这一点,因为我在处理通知后触发的 NotificationSent 事件中获得了 nexmo MessageId。
但是,在电子邮件的事件实例中,响应为空。
知道我遗漏了什么,或者如何检索 mailgun 消息 ID?
我在我的 laravel 应用程序中使用 Mailgun 作为邮件驱动程序,以及用于 SMS 目的的 nexmo。
我想要实现的是维护通过 Mailgun 或 Nexmo 发送的通知的传递状态。在 Nexmo 的情况下,我能够实现这一点,因为我在处理通知后触发的 NotificationSent 事件中获得了 nexmo MessageId。
但是,在电子邮件的事件实例中,响应为空。
知道我遗漏了什么,或者如何检索 mailgun 消息 ID?
我找到了一种解决方法,现在可以完成这项工作。没有我想要的那么整洁,但张贴以供将来参考,以防有人需要。
我创建了一个扩展 Illuminate\Notifications\Channels\MailChannel 的自定义通知通道
class EmailChannel extends MailChannel
{
/**
* Send the given notification.
*
* @param mixed $notifiable
* @param \Illuminate\Notifications\Notification $notification
* @return void
*/
public function send($notifiable, Notification $notification)
{
if (! $notifiable->routeNotificationFor('mail')) {
return;
}
$message = $notification->toMail($notifiable);
if ($message instanceof Mailable) {
return $message->send($this->mailer);
}
$this->mailer->send($message->view, $message->data(), function ($m) use ($notifiable, $notification, $message) {
$recipients = empty($message->to) ? $notifiable->routeNotificationFor('mail') : $message->to;
if (! empty($message->from)) {
$m->from($message->from[0], isset($message->from[1]) ? $message->from[1] : null);
}
if (is_array($recipients)) {
$m->bcc($recipients);
} else {
$m->to($recipients);
}
if ($message->cc) {
$m->cc($message->cc);
}
if (! empty($message->replyTo)) {
$m->replyTo($message->replyTo[0], isset($message->replyTo[1]) ? $message->replyTo[1] : null);
}
$m->subject($message->subject ?: Str::title(
Str::snake(class_basename($notification), ' ')
));
foreach ($message->attachments as $attachment) {
$m->attach($attachment['file'], $attachment['options']);
}
foreach ($message->rawAttachments as $attachment) {
$m->attachData($attachment['data'], $attachment['name'], $attachment['options']);
}
if (! is_null($message->priority)) {
$m->setPriority($message->priority);
}
$message = $notification->getMessage(); // I have this method in my notification class which returns an eloquent model
$message->email_id = $m->getSwiftMessage()->getId();
$message->save();
});
}
}
查看代码(MailgunTransport)时,它将执行以下操作
$this->client->post($this->url, $this->payload($message, $to));
$this->sendPerformed($message);
return $this->numberOfRecipients($message);
由于 Laravel 合约要求实现发回发送的电子邮件数量。
即使您能够进入邮件传输,它也不会存储来自这个原因的响应,因此无法捕获消息 ID。
您可以做的是实现自己的(或查看 packagegist)以适应邮件客户端,但这不是一个完美的解决方案,需要一些丑陋的instanceof
检查。