Laravel通过Mailgun发送邮件时如何获取唯一ID以跟踪Webhook
获取Laravel发送Mailgun邮件的唯一消息ID用于Webhook追踪
我查看了Mailgun API,发现其发送Webhook时会携带如下唯一ID:
"id": "-laxIqj9QWubsjY_3pTq_g",这应该是每封邮件的唯一标识。请问在Laravel中使用如下代码发送邮件时,能否在发送时获取该ID,以便对应跟踪收到的Webhook?仅通过收件人邮箱无法满足我的追踪需求。
邮件发送代码:
Mail::send('email.subscription', $data, function ($message) use ($email) { $message->to($email)->subject('Welcome')->from('no-reply@name.com', 'My Name'); });
当然可以获取到这个Mailgun的邮件唯一ID!Laravel的Mailgun驱动已经内置了获取该标识的能力,只需要稍微调整你的发送代码就能实现,下面分两种情况说明:
方法一:兼容大部分Laravel版本(包括旧版)
当你调用Mail::send()时,它会返回一个Illuminate\Mail\SentMessage实例,我们可以从这个实例里提取Mailgun返回的消息ID:
// 先把发送结果赋值给变量 $sentMessage = Mail::send('email.subscription', $data, function ($message) use ($email) { $message->to($email)->subject('Welcome')->from('no-reply@name.com', 'My Name'); }); // 获取底层的SwiftMailer消息实例 $swiftMessage = $sentMessage->getSwiftMessage(); // 从邮件头里提取Mailgun的消息ID $mailgunMessageId = $swiftMessage->getHeaders()->get('X-Mailgun-Message-ID')->getValue();
这里的$mailgunMessageId就是和Webhook中id字段完全对应的唯一标识。
方法二:Laravel 9+ 简化写法
如果你使用的是Laravel 9及以上版本,框架对Mailgun的支持更友好,提供了直接获取消息ID的方法:
$sentMessage = Mail::send('email.subscription', $data, function ($message) use ($email) { $message->to($email)->subject('Welcome')->from('no-reply@name.com', 'My Name'); }); // 直接获取Mailgun消息ID $mailgunMessageId = $sentMessage->getMessageId();
拿到这个ID之后,你可以把它和你的业务数据(比如用户ID、订阅记录ID)关联存储到数据库中。当Mailgun的Webhook触发时,只需要用Webhook里的id字段去匹配你存储的ID,就能精准追踪到对应邮件的业务记录,完全解决仅靠收件人邮箱无法区分的问题。
内容的提问来源于stack exchange,提问作者Miljan Rakita
相关产品推荐
相关产品推荐

