Как передать идентификатор Mailgun ID, созданный в MailgunTransport, прослушивателю событий в Laravel? - PullRequest
1 голос
/ 11 декабря 2019

В моем приложении Laravel у меня есть прослушиватель событий, который срабатывает при добавлении кого-либо в курс, а затем отправляет электронное письмо этому пользователю: «Вы были добавлены в курс».

Я использую Mailgun для отправки этих электронных писем, и в этом Слушателе я вызываю \Mail, который создает файл блейда и отправляет электронное письмо пользователям, что все отлично работает.

Моя проблема в том, что я хочу сохранить идентификатор Mailgun ID. Который в Laravel v6 добавляется в Illuminate\Mail\Transport\MailgunTransport@send, и я могу получить доступ к этому идентификатору, позвонив $message->getId(), который, я думаю, можно найти в vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/SimpleMessage.php

Как мне вернуть $message->getId(), чтобы я мог использовать его вмой слушатель?

В моем слушателе \Mail я звоню своей модели, чтобы создать вновь отправленную запись электронной почты, и хочу сохранить этот идентификатор.

Ниже приведена ссылка на мой начальный адрес. вопрос, который https://stackoverflow.com/users/2343305/ilgala смог выручить:

Как получить доставленное сообщение с помощью Mailgun в Laravel

1 Ответ

1 голос
/ 12 декабря 2019

Я также ответил на ваш старый вопрос. Я думаю, что вы неправильно понимаете процесс. Здесь я создам полный пример для Laravel 6.x, но он должен быть таким же для старых версий.

1. Настройка почтового пистолета

Это самая простая часть. Просто измените файл services.php с учетными данными mailgun и не забудьте запросить с помощью composer пакет guzzlehttp/guzzle, иначе вы не сможете отправлять электронную почту. Затем измените файл .env и установите MAIL_DRIVER на mailgun. Таким образом, Laravel будет знать, что он должен использовать этот драйвер для отправки электронной почты.

2. Создайте свою логику

Допустим, вам нужно отправлять электронную почту каждый раз, когда клиент создает и заказывает. У вас будет OrderController где-то в вашей кодовой базе с методом store, который создает заказ и сразу после этого отправляет электронное письмо. Что-то вроде

public function store(Request $request)
{
  // Validate your request
  $this->validate([...]);

  // Create the order
  $order = new Order();
  $order->fill($request->only([...]));

  // Save order
  $order->save();

  // Send confirmation email;
  Mail::to(auth()->user())->send(new OrderCreated($order));
}

Поскольку вы установили драйвер почтового пистолета, фасад Mail автоматически будет использовать класс MailgunTransport.

3. Создайте слушателя

Как объяснено в мой другой ответ , установите слушателя в EventServiceProvider. После создания прослушивателя вы можете получить идентификатор почтового пистолета следующим образом:

/**
 * Handle the event.
 *
 * @param  \Illuminate\Mail\Events\MessageSent  $event
 * @return void
 */
public function handle(MessageSent $event)
{
    // Retrieve mailgun ID from the message headers
    $id = $event->message->getHeaders()->get('X-Mailgun-Message-ID');
}
...