如何正确解析MimeMessage?解析Received头的for值是否安全?
我们使用Amazon SES接收邮件并存入S3,消息为MIME 1.0格式,有时邮件的To、Cc、Bcc字段为空,这种情况下解析Received头里的for值是靠谱的,但要注意只取SES自身添加的那条Received头,具体原因和注意事项如下:
SES生成的Received头里的for值完全可信
邮件到达SES时,SES会自动添加一条包含自身服务器标识(比如inbound-smtp.eu-west-1.amazonaws.com)的Received头,这条头里的for值对应SMTP会话中的RCPT TO指令内容——也就是邮件实际要投递的目标收件人,这个值是SES在接收邮件过程中直接获取的,发件人无法篡改。其他中转节点的Received头不可信
如果邮件经过了第三方中转服务器,这些服务器添加的Received头可能被伪造或篡改,里面的for值不一定是真实收件人,所以必须过滤掉这些,只保留SES生成的那条。完美适配To/Cc/Bcc为空的场景
MIME头里的To、Cc、Bcc是发件人可以随意修改甚至清空的(比如群发BCC时To字段常为空,或者发件人故意隐藏收件人),但SMTP层面的RCPT TO是邮件投递的真实目标,SES记录在自己的Received头里的for值就是这个真实信息,刚好能解决MIME头字段为空的问题。
举个你提供的例子:
Received: from sender@email.com (mout.perfora.net [74.208.4.197])
by inbound-smtp.eu-west-1.amazonaws.com with SMTP id i9345l5jt652cm6mnupeorc57rfmf7p6me31ca01
for receiver@email.com;
Mon, 14 Nov 2022 18:41:44 +0000 (UTC)
这条就是SES添加的Received头,里面的receiver@email.com就是真实的收件人,完全可以放心使用。
额外注意事项
- 解析时要识别SES的Received头:通过
inbound-smtp.[区域].amazonaws.com这个特征字符串来筛选,确保只处理SES生成的那条。 - 兼容格式变化:
for后面的收件人可能带尖括号(比如for <receiver@email.com>),解析逻辑要能处理这种格式,提取出正确的邮箱地址。
内容的提问来源于stack exchange,提问作者N. G.

