Amazon SES:获取入站邮件的实际收件人
解决Amazon SES多收件人邮件副本的收件人识别问题
我之前也碰到过SES的这个特性,确实有点棘手——当一封邮件发给多个你的域名下的收件人时,SES会为每个收件人单独生成一份邮件副本存到S3,但默认情况下仅靠邮件原生的To字段根本分不清当前副本对应哪个收件人。这里有几个实用的解决方法:
方法1:读取SES专属的自定义头部字段
SES会自动为每一份收件人副本添加专属的头部信息,用来标记这封副本对应的单个收件人,常见的字段有:
X-SES-Recipient:直接记录当前副本的目标收件人邮箱X-SES-Original-To:部分配置下会使用这个字段
你可以在Java解析邮件的时候,优先读取这些SES生成的头部,而不是依赖邮件原生的To字段。用JavaMail API的示例代码如下:
// 假设message是你解析后的MimeMessage对象 String targetRecipient = message.getHeader("X-SES-Recipient", null); if (targetRecipient == null) { // 备用方案:尝试读取X-SES-Original-To targetRecipient = message.getHeader("X-SES-Original-To", null); } if (targetRecipient != null) { // 这里拿到的就是当前S3副本对应的单个收件人,直接用来执行对应操作即可 processRecipientAction(targetRecipient); }
建议先去S3里下载一两份重复的邮件文件,打开查看头部内容,确认你的SES配置下实际存在哪个字段。
方法2:在S3对象键中嵌入收件人信息
你还可以在配置SES的S3投递规则时,直接把收件人信息写到S3对象的文件名里,这样程序甚至不用解析邮件就能知道对应的收件人。
操作步骤:
- 登录SES控制台,找到对应的收件规则集
- 编辑S3动作的配置,在对象键前缀或对象键后缀中使用变量
{recipient} - 比如设置前缀为
incoming-emails/{recipient}/,那么S3里的邮件路径就会变成incoming-emails/A@mydomain.com/xxxxxx.eml,或者后缀设为-{recipient}.eml,文件名就是xxxxxx-A@mydomain.com.eml
你的Java程序在遍历S3对象时,直接从对象键(文件名/路径)里提取{recipient}对应的邮箱地址即可,这种方式效率更高,也避免了解析邮件头部的麻烦。
方法3:检查SMTP信封收件人字段
如果上面两种方法都不适用,还可以尝试读取邮件的Delivered-To或Return-Path字段,这两个字段记录了SMTP传输过程中的实际收件人信息,不过优先级不如SES专属头部高,因为部分邮件客户端可能会修改这些字段。示例代码:
String deliveredTo = message.getHeader("Delivered-To", null);
内容的提问来源于stack exchange,提问作者Cccompany
相关产品推荐
相关产品推荐

