Laravel Уведомления: Почта (Mailgun) Ответ на событие NotificationSent

Я использую Mailgun в качестве почтового драйвера в своем приложении laravel, а также nexmo для SMS.

Я пытаюсь добиться статуса доставки уведомлений, отправляемых через Mailgun или Nexmo. В случае Nexmo я могу достичь этого, так как я получаю nexmo MessageId в событии NotificationSent, которое запускается после обработки уведомления.

Однако в случае события для электронной почты ответ пуст.

Любая идея, что мне не хватает или, как я могу получить идентификатор сообщения почтовой пушки?

2

Решение

При взгляде на код (MailgunTransport) это будет делать следующее

    $this->client->post($this->url, $this->payload($message, $to));
$this->sendPerformed($message);
return $this->numberOfRecipients($message);

Поскольку контракт Laravel требует реализации, чтобы отправить обратно количество отправленных электронных писем.

Даже если вы сможете попасть в почтовый транспорт, он не сохранит ответ, по этой причине невозможно поймать идентификатор сообщения.

Что вы могли бы сделать, это реализовать свой собственный (или посмотреть в packagist), чтобы адаптировать почтовый клиент, но это не идеальное решение и потребует некоторых уродливых instanceof чеки.

1

Другие решения

Я нашел обходной путь, который делает эту работу на данный момент. Не так аккуратно, как хотелось бы, но публикация для будущих ссылок, если кому-то это нужно.

Я создал пользовательский канал уведомлений, расширяющий 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.

0

По вопросам рекламы [email protected]