回复邮件中References标头值未按RFC-2822规范保留问题咨询
我最近遇到一个问题:按照RFC-2822第3.6.4节的规定,回复邮件应该保留父邮件References标头的原有值,再追加父邮件的Message-ID。我用Java Mail API给父邮件设置了References标头,代码如下:
msg.setHeader("References", "reference value <ADDAFTERTHIS>"); msg.setFrom(from); msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); msg.setSubject(subject); msg.setText(text); Transport.send(msg);
发送后的父邮件头信息是这样的:
From : xxxxxx
To: xxxxxxx
Message-ID: xx1xx0110.x.16xxxx6394@xxxxxx
References: reference value
Subject: check from mobile Mail|Test
但用Gmail回复这封父邮件时,回复邮件的References标头只保留了父邮件的Message-ID,完全没带上我设置的原有值:
Wed, 30 Mar 2022 06:16:17 -0700 (PDT)
MIME-Version: 1.0
References: xx1xx0110.x.16xxxx6394@xxxxxx
In-Reply-To: xx1xx0110.x.16xxxx6394@xxxxxx
请问怎么才能让回复邮件按照RFC-2822规范,保留父邮件References标头的原有值并追加父邮件的Message-ID?
问题原因分析
Gmail的邮件客户端(网页端、移动端)会严格校验References标头的格式——根据RFC-2822的定义,References标头的每个条目都必须是合法的Message-ID,也就是必须用<>包裹,且符合[唯一字符串]@[域名]的标准格式。
你设置的"reference value <ADDAFTERTHIS>"里,reference value不是合法的Message-ID格式,Gmail会直接过滤掉这部分无效内容,只识别并保留父邮件自身的合法Message-ID,所以回复时就只显示了这个ID。
解决方案
严格遵循Message-ID格式设置References标头
确保References标头的每个值都是符合规范的Message-ID,多个ID之间用空格分隔。比如把你的代码修改为:// 示例:两个合法的Message-ID,用空格分隔 msg.setHeader("References", "<valid-prev-id@your-domain.com> <ADDAFTERTHIS>");这里的
<valid-prev-id@your-domain.com>和<ADDAFTERTHIS>都必须是符合标准的Message-ID(如果<ADDAFTERTHIS>是测试用的占位符,记得替换成真实的合法ID)。区分标头和正文的用途
如果需要添加额外的文本说明,不要放在References标头里——这个标头的核心作用是串联邮件线程的Message-ID链,额外文本应该放在邮件正文中,避免被客户端过滤。验证父邮件的Message-ID格式
虽然你的父邮件Message-ID看起来是合法的,但也要确保它符合RFC标准,避免Gmail在处理时出现异常。
这样设置后,Gmail在回复时就会正确继承References标头的所有合法Message-ID,再追加父邮件的Message-ID,符合RFC-2822的规范要求。
内容的提问来源于stack exchange,提问作者Rituraj Ghosh

