Laravel中Swift邮件服务添加自定义UUID实现退信精准追踪的方法
解决方案
方案1:直接获取Swift_Message自带的唯一Message-ID
Swift_Message实例在初始化后就会自动生成全局唯一的Message-ID头,不需要等发送完成,你可以直接通过getId()方法读取该值,示例修改代码如下:
$message_out = (new \Swift_Message($out->subject)) ->setFrom($out->from_email, $out->from_name) ->setTo($out->email) ->setBody($content, 'text/html') ->setReplyTo('noreply@foo.com', 'No reply'); // 直接获取自动生成的Message-ID $email_uuid = $message_out->getId(); // 此处将$email_uuid和当前邮件的关联数据存入你的数据库即可 $message_out->send($mensaje_mail, $errors_sent);
退信解析时直接读取原始邮件头里的Message-ID字段匹配即可,绝大多数邮件服务退信时会保留原始邮件的Message-ID在退信内容的头或正文引用部分。
方案2:自定义UUID头
如果你想使用自己生成的UUID规则,可以手动添加自定义邮件头,自定义头建议以X-前缀开头避免和标准头冲突,示例如下:
// 生成自定义UUID,这里用PHP内置方法即可,也可以替换为你自己的UUID生成逻辑 $custom_uuid = uniqid('email_', true); $message_out = (new \Swift_Message($out->subject)) ->setFrom($out->from_email, $out->from_name) ->setTo($out->email) ->setBody($content, 'text/html') ->setReplyTo('noreply@foo.com', 'No reply'); // 添加自定义UUID头 $message_out->getHeaders()->addTextHeader('X-Custom-Email-Uuid', $custom_uuid); // 存储$custom_uuid和当前邮件的关联数据 $message_out->send($mensaje_mail, $errors_sent);
退信时直接解析头里的X-Custom-Email-Uuid字段匹配即可,该自定义头会被绝大多数邮件服务器在退信中保留。
注意事项
- 两种方案都可以满足匹配需求,优先推荐方案1,不需要额外实现UUID生成逻辑,兼容性更好
- 如果遇到个别服务商不保留自定义头,可优先尝试解析退信中引用的原始邮件
Message-ID,匹配成功率更高
内容的提问来源于stack exchange,提问作者Tanker
相关产品推荐
相关产品推荐

