Mail:to 调用的方法之后是否可以在 Laravel 中获得 Mail 响应?哪里是最好的地方?
Mail::to($order->email)
->send(new ThankYouMail($order->fresh()));
我使用 Sendgrid 作为 Laravel Mail 驱动程序,并希望获取 messageID 以便用于后续的 Sendgrid 挂钩(获取电子邮件发送状态等)。
public function build()
{
$from = '[email protected] /cdn-cgi/l/email-protection';
$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:
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 仪表板中,找到 Webhooks 设置并放置您的 API POST 端点:api.yourdomain.com/sendgrid/events
因此之后,Sendgrid 将能够生成事件并向您的 API 端点发送 POST 请求,您的逻辑可以在其中接收和处理传入数据。
更多细节:https://sendgrid.com/docs/for-developers/tracking-events/event/ https://sendgrid.com/docs/for-developers/tracking-events/event/