使用Graph Client发送邮件自定义Header,回复未携带的解决方案咨询
使用Graph Client发送带有自定义Header的邮件,期望回复邮件中也包含相同的Header以实现对话追踪,但回复邮件中并未携带这些Header。请问是否有办法让所有回复邮件都携带这些自定义Header?
发送邮件的代码示例
Message message = new Message(); message.subject = "9/9/2018: DRaft _ testing"; ItemBody body = new ItemBody(); body.content = "The group represents Nevada."; message.body = body; LinkedList<Recipient> toRecipientsList = new LinkedList<Recipient>(); Recipient toRecipients = new Recipient(); EmailAddress emailAddress = new EmailAddress(); emailAddress.address = "dummy@ggg.net"; toRecipients.emailAddress = emailAddress; toRecipientsList.add(toRecipients); message.toRecipients = toRecipientsList; SingleValueLegacyExtendedProperty singleValueLegacyExtendedProperty = new SingleValueLegacyExtendedProperty(); singleValueLegacyExtendedProperty.id="propery-id_graph"; singleValueLegacyExtendedProperty.value ="propery-id_graph/Aamir"; List<SingleValueLegacyExtendedProperty> singleValueLegacyExtendedProperties = new LinkedList<>(); singleValueLegacyExtendedProperties.add(singleValueLegacyExtendedProperty); SingleValueLegacyExtendedPropertyCollectionRequestBuilder builder=new SingleValueLegacyExtendedPropertyCollectionRequestBuilder(); message.singleValueExtendedProperties = new SingleValueLegacyExtendedPropertyCollectionPage(singleValueLegacyExtendedProperties); LinkedList<InternetMessageHeader> internetMessageHeadersList = new LinkedList<InternetMessageHeader>(); InternetMessageHeader internetMessageHeaders = new InternetMessageHeader(); internetMessageHeaders.name = "x-Header-1"; internetMessageHeaders.value = "aaa"; internetMessageHeadersList.add(internetMessageHeaders); InternetMessageHeader internetMessageHeaders1 = new InternetMessageHeader(); internetMessageHeaders1.name = "x-Header-2"; internetMessageHeaders1.value = "bbb"; internetMessageHeadersList.add(internetMessageHeaders1); message.internetMessageHeaders = internetMessageHeadersList;
自定义SMTP头(比如你代码里的x-Header-1、x-Header-2)默认不会被邮件客户端在回复时自动继承,因为大多数客户端仅保留标准的邮件追踪头(如Message-ID、In-Reply-To)。要实现对话追踪,推荐以下几种可靠方式:
1. 将追踪信息嵌入邮件主题
在邮件主题前添加唯一追踪标识,比如:
[TRK-12345] 9/9/2018: DRaft _ testing
邮件客户端回复时通常会自动添加Re:前缀,追踪标识会被保留,你可以通过解析回复邮件的主题提取追踪ID,实现对话关联。这种方式兼容性最好,不受邮件系统或客户端限制。
2. 正确使用Exchange扩展属性(内部环境适用)
你代码里尝试使用了SingleValueLegacyExtendedProperty,但当前的属性ID格式不正确,导致属性无法被正确存储和继承。正确的扩展属性ID需要指定属性集、数据类型和名称,示例格式如下:
SingleValueLegacyExtendedProperty trackingProperty = new SingleValueLegacyExtendedProperty(); // 格式:[数据类型] {属性集GUID} Name [属性名称] trackingProperty.id = "String {00020329-0000-0000-C000-000000000046} Name tracking-id"; trackingProperty.value = "propery-id_graph/Aamir";
这种属性存储在Exchange服务器端,当Exchange内部用户回复邮件时,该属性会被自动保留。你可以通过Graph API查询回复邮件的singleValueExtendedProperties来获取追踪信息。但注意:如果邮件被转发到非Exchange邮箱(如Gmail),这类扩展属性会丢失,仅适用于Exchange内部环境。
3. 自定义SMTP头继承(局限性大)
如果必须使用SMTP头,需要接收方的邮件客户端支持自定义头继承,但不同客户端(Outlook、Gmail、Thunderbird)的行为不一致,无法保证所有回复都携带自定义头,因此不推荐这种方式。
内容的提问来源于stack exchange,提问作者Nishant Kumar Jain

