如何在Mailgun中设置自定义消息ID?含PHP/Webhook场景问询
如何在Mailgun发送的邮件中设置自定义消息ID并确保Webhook返回它
嘿,我之前刚好折腾过这个需求,来给你一步步讲清楚:
一、通用设置逻辑
Mailgun支持通过自定义邮件头部来设置消息ID,但有个关键要求:你的自定义ID必须符合RFC 5322标准,也就是得是本地标识@你的域名的格式(比如order-12345@your-sending-domain.com)。如果格式不对,Mailgun会直接忽略你的自定义值,继续用它生成的默认消息ID。
二、PHP具体实现方法
不管你用Mailgun的官方SDK还是直接发API请求,都能轻松加上这个自定义头部:
1. 使用Mailgun官方SDK(v3版本)
这是最推荐的方式,代码简洁且不易出错:
use Mailgun\Mailgun; // 初始化Mailgun客户端 $mgClient = Mailgun::create('你的API密钥'); $sendDomain = '你的发送域名(比如mg.yourdomain.com)'; // 发送邮件并设置自定义Message-ID $mgClient->messages()->send($sendDomain, [ 'from' => '你的发件人 <sender@yourdomain.com>', 'to' => '收件人 <recipient@example.com>', 'subject' => '带自定义消息ID的测试邮件', 'text' => '这封邮件使用了我们自己定义的Message-ID!', 'h:Message-ID' => 'order-12345@your-sending-domain.com' // 核心:自定义消息ID ]);
2. 直接用cURL发送API请求
如果不想依赖SDK,也可以直接发cURL请求:
$curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => 'https://api.mailgun.net/v3/你的发送域名/messages', CURLOPT_HTTPAUTH => CURLAUTH_BASIC, CURLOPT_USERPWD => 'api:你的API密钥', CURLOPT_POST => true, CURLOPT_POSTFIELDS => [ 'from' => '你的发件人 <sender@yourdomain.com>', 'to' => '收件人 <recipient@example.com>', 'subject' => 'cURL发送的自定义Message-ID测试邮件', 'text' => '通过cURL设置自定义Message-ID成功!', 'h:Message-ID' => 'invoice-67890@your-sending-domain.com' ] ]); $response = curl_exec($curl); curl_close($curl);
三、确保Webhook返回自定义消息ID
只要你的自定义Message-ID格式合法,Mailgun的所有Webhook事件(比如delivered、opened、failed等)的Payload里,都会直接包含这个message-id字段,不需要额外配置!
注意事项
- 自定义ID必须全局唯一,否则会导致邮件追踪数据混乱
- 一定要带
@域名部分,纯字符串(比如order-12345)会被Mailgun忽略 - 头部键名
h:Message-ID的大小写要严格对应,写错的话不会生效
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

