【问题标题】:How to get Laravel Mail response after send function called?调用发送函数后如何获取 Laravel 邮件响应?
【发布时间】:2019-08-29 15:17:29
【问题描述】:

是否有可能在 Laravel 中获取 Mail 响应后 Mail:to 调用的方法?最好的地方在哪里?

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

我正在使用 Sendgrid 作为 Laravel 邮件驱动程序,并希望获取 messageID 以便用于以后的 Sendgrid 挂钩(获取电子邮件传递状态等)。

public function build()
{
    $from = 'info@domain.com';
    $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);
}

更新:2019/06/25

如果有人想获取和存储邮件状态,使用 Sendgrid Event Webhook 是最好的解决方案。

  • 您可能会在电子邮件发送过程中(在电子邮件中附加)一个唯一的参数,例如 OrderID(检查 Sendgrid API 或我上面的示例)。
  • 之后,您必须创建 API POST 路由以接收/存储 Webhook 电子邮件数据,您可以在其中过滤/瞄准和连接状态数据。

更新 #2:2021/01/21

为了从 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 仪表板中,找到 webhook 设置并放置您的 API POST 端点:api.yourdomain.com/sendgrid/events,这样之后,Sendgrid 将能够生成事件并将 POST 请求发送到您的逻辑可以接收和处理传入数据的 API 端点.

更多详情:https://sendgrid.com/docs/for-developers/tracking-events/event/

【问题讨论】:

  • 嘿@SlavisaPetkovic 你能和我们分享一下你是如何使用 SendGrid Event Webbook 来获取有关已发送电子邮件的更多信息的吗?我没有找到使用 Laravel/PHP 的示例。谢谢
  • 嘿@Bill 检查我的问题的更新;)

标签: php laravel sendgrid


【解决方案1】:

邮件发送后发送Illuminate\Mail\Events\MessageSent[1]

此事件与 swift 消息实例的实例一起分派。 [2]

你可以监听这个事件并获取消息ID。

可以通过在EventServiceProvider的启动方法中注册一个事件监听器来订阅这个事件。 [3]

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

MessageIdTranscript 是一个普通的 PHP 类,带有一个随事件调用的 handle 方法。 Swift_Message 的实例通过名为 getId 的公共 getter 方法公开消息 Id。

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...
    }

}

【讨论】:

    【解决方案2】:

    将侦听器附加到 sendgrid api 响应而不是构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2020-11-04
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多