php - 调用发送函数后如何获取 Laravel 邮件响应?
问题描述
是否可以在 Mail:to 调用方法之后在 Laravel 中获得邮件响应?最好的地方在哪里?
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/
解决方案
邮件Illuminate\Mail\Events\MessageSent
发送后发送[1]
此事件与 swift 消息实例的实例一起分派。[2]
您可以监听此事件并获取消息 ID。
EventServiceProvider
可以通过在事件监听器的 boot 方法中注册来订阅此事件。[3]
protected $listen = [
'Illuminate\Mail\Events\MessageSent' => [
'App\Handlers\Events\MessageIdTranscript',
],
];
这MessageIdTranscript
是一个普通的 PHP 类,带有一个handle
通过事件调用的方法。Swift_Message
通过名为 的公共 getter 方法公开消息 Id 的实例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...
}
}
推荐阅读
- apache-spark - PySpark:使用行的主键作为 rand 的种子
- r - 如何在 Kable 中居中刷新右列文本?
- c# - C# 如果包含/等于
- botframework - Ms Bot V4(LUIS) 尝试启用通道 Cortana 时出现内部服务器错误
- mongodb - 更新依赖于新更新的文档键的值
- python - Matplotlib 动画 - 空轴
- graphql - 是否可以创建 GraphQL 子查询来创建数组作为 markdownRemark 的元素?
- python - 二维图像的地形高度预测
- sql - 如何创建检查以确保列中只有一个条目可以具有基于 SQL 中不同列的 id 的特定值?
- javascript - 自动将 Google 表格打开到最后一行第一列的脚本语言是什么?