Как получить ответ Laravel Mail после вызова функции отправки?

Можно ли получить ответ Mail в Laravel после вызова метода Mail: to? Где лучше всего это сделать?

Mail::to($order->email)
  ->send(new ThankYouMail($order->fresh())); 

Я использую Sendgrid в качестве драйвера Laravel Mail и хочу получить идентификатор сообщения, чтобы использовать его для последующих перехватчиков Sendgrid (получить статус доставки электронной почты и т. д.).

public function build()
{
    $from = '[email protected]';
    $subject = 'Thank You for Ordering';
    $name = 'Name XYZ';

    $order_id = (string)$this->order->id;
    $headerData = [
      'category' => 'Order',
      'unique_args' => [
          'OrderID' => $order_id
      ]
    ];

    $header = $this->asString($headerData);

    $this->withSwiftMessage(function ($message) use ($header) {
      $message->getHeaders()
              ->addTextHeader('X-SMTPAPI', $header);
    });

    return $this->view('mails.thank-you')
                ->from($from, $name)
                ->replyTo($from, $name)
                ->subject($subject);
}

ОБНОВЛЕНИЕ: 25.06.2019

Если кто-то хочет получать и хранить почтовые статусы, лучшим решением будет использование Sendgrid Event Webhook.

  • Возможно, вы прикрепите (к электронному письму) уникальный аргумент, такой как OrderID, во время процесса отправки электронной почты (проверьте API Sendgrid или мой пример выше).
  • После этого вам необходимо создать маршрут API POST, чтобы получать/хранить данные электронной почты Webhook, где вы можете фильтровать/направлять и подключать данные о состоянии.

ОБНОВЛЕНИЕ № 2: 21 января 2021 г.

Для получения данных из Sendgrid необходимо создать некоторую логику:

Маршрут:

Route::post('sendgrid/events','SendgridOrderEventController@store');

Контроллер:

/**
* Store a sendgrid event in database.
* @param  App\Http\Requests\API\CreateSendgridOrderEventRequest $request
* @return Response
*/
public function store(CreateSendgridOrderEventRequest $request)
{
  $sendgrid_request = $request->all()[0];

  if ($sendgrid_request['OrderID']) {
    
    $sendgrid_request['order_id'] = $sendgrid_request['OrderID'];
    $sendgrid_request['sendgrid_timestamp'] = $sendgrid_request['timestamp'];
    $sendgrid_request['sendgrid_message_id'] = $sendgrid_request['sg_message_id'];

    $sendgridOrderEvent = SendgridOrderEvent::create($sendgrid_request);
  }

  return $this->sendResponse($sendgridOrderEvent, 'SendGrid Order Event created successfully');
}

На панели управления Sendgrid найдите настройки веб-перехватчиков и разместите конечную точку API POST: api.yourdomain.com/sendgrid/events после этого Sendgrid сможет генерировать события и отправлять запрос POST на конечную точку API, где ваша логика может получать и обрабатывать входящие данные.

Подробнее: https://sendgrid.com/docs/for-developers/tracking-events/event/

Привет @SlavisaPetkovic Можете ли вы рассказать нам, как вы использовали веб-книгу событий SendGrid, чтобы получить больше информации об отправленном электронном письме? Я не нахожу примеров использования этого с Laravel/PHP. Спасибо

Bill 21.01.2021 17:07

Эй, @Bill, проверь обновления моего вопроса;)

SlavisaPetkovic 21.01.2021 23:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
2
3 499
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Прикрепите прослушиватель к ответу API sendgrid, а не к сборке.

Ответ принят как подходящий

Illuminate\Mail\Events\MessageSent отправляется после отправки почты [1]

Это событие отправляется с экземпляром экземпляра быстрого сообщения. [2]

Вы можете прослушать это событие и получить идентификатор сообщения.

На это событие можно подписаться, зарегистрировавшись в методе загрузки EventServiceProvider прослушивателя событий. [3]

protected $listen = [
    'Illuminate\Mail\Events\MessageSent' => [
        'App\Handlers\Events\MessageIdTranscript',
    ],
];

MessageIdTranscript — это простой класс PHP с методом handle, который вызывается вместе с событием. Экземпляры Swift_Message предоставляют идентификатор сообщения через общедоступный метод получения с именем getId.

namespace App\Handlers\Events;

use Illuminate\Mail\Events\MessageSent;

class MessageIdTranscript {

    /**
     * Handle the event.
     *
     * @param  MessageSent  $event
     * @return void
     */
    public function handle(MessageSent $event)
    {
        $messageId = $event->message->getId();
        // continue handling...
    }

}

Другие вопросы по теме