Laravel Уведомления: Почта (Mailgun) Ответ на событие NotificationSent
Я использую Mailgun в качестве почтового драйвера в своем приложении laravel, а также nexmo для SMS-сообщений.
Я пытаюсь добиться статуса доставки уведомлений, которые отправляются через Mailgun или Nexmo. В случае Nexmo я могу достичь этого, так как я получаю nexmo MessageId в событии NotificationSent, которое запускается после обработки уведомления.
Однако в случае события для электронной почты ответ пуст.
Любая идея, что мне не хватает или, как я могу получить идентификатор сообщения почтовой пушки?
2 ответа
Я нашел обходной путь, который делает эту работу на данный момент. Не так аккуратно, как хотелось бы, но публикация для будущих ссылок, если кому-то это понадобится.
Я создал пользовательский канал уведомлений, расширяющий 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();
});
}
}
Я все еще ищу решение для достижения этого с событием NotificationSent.
При просмотре кода ( MailgunTransport) он сделает следующее
$this->client->post($this->url, $this->payload($message, $to));
$this->sendPerformed($message);
return $this->numberOfRecipients($message);
Поскольку контракт Laravel требует реализации, чтобы отправить обратно количество отправленных электронных писем.
Даже если вы сможете попасть в почтовый транспорт, он не сохранит ответ, по этой причине невозможно поймать идентификатор сообщения.
То, что вы могли бы сделать, это реализовать свой собственный (или посмотреть на packagist), чтобы адаптировать почтовый клиент, но это не идеальное решение и потребует некоторых уродливых instanceof
чеки.