由于Gmail上缺少MESSAGE-ID标头,无法在同一个会话中保留邮件

时间:2014-10-09 07:30:42

标签: gmail imap gmail-api

在Gmail中的某些邮件中,MESSAGE-ID标题丢失,我需要在回复时将其用作IN-REPLY-TO标题,以便我可以将回复保留在同一个对话中。 如果从Gmail的网页用户界面回复了那些缺少MESSAGE-ID标题的电子邮件,则回复会保留在对话中,而回复实际上会获得IN-REPLY-TO标题<-4185615914882731559@unknownmsgid>我无法发现这是如何产生的。

我一直试图找到这个问题的解决方案很长一段时间,最后尝试了几个桌面电子邮件客户端,Airmail和Sparrow来了解他们的行为方式。如果我使用这些电子邮件客户端回复丢失MESSAGE-ID标题的特定电子邮件,则发送的回复也会获取相同的IN-REPLY-TO标题<-4185615914882731559@unknownmsgid>,并且回复确实会保留在同一个对话中预期

所以,我想问一下他们是如何实现这一点的,他们是否会以某种方式生成IN-REPLY-TO标题<-4185615914882731559@unknownmsgid>?有规则还是变通方法?

3 个答案:

答案 0 :(得分:4)

这是一个经典问题,每个邮件阅读器都有它。经典的解决方案是:

  • 从您回复的邮件中复制“引用”字段(如果有)。
  • 构成一个In-Reply-To字段,可能带有一个虚构的消息ID,可能带有发件人的地址和消息的日期。
  • 保留主题,并附加“re:”。
  • 您也可以复制Thread-Index字段(如果有)。

Gmail和大多数其他线程算法将连接点。

据我所知,线程索引是微软的事情,没有其他人使用它。未指定hex blob的格式,但如果原始邮件来自Exchange,复制将有助于Exchange。

答案 1 :(得分:1)

如果您只想发送电子邮件并确保其与该用户收件箱中的其他电子邮件(而不是可能收到回复的任何其他Gmail用户)进行通信,那么我相信您可以使用Gmail API的messages.send()方法并设置message.threadId以匹配您希望与其进行线程化的线程。

答案 2 :(得分:1)

我不认为发送到您的Gmail帐户的电子邮件没有消息ID。我的证据是我只是尝试通过telnet向我自己发送一个没有消息ID,并且gmail的mx服务器添加了这个

Message-Id: <54412844.63bbb40a.0772.ffffcbdcSMTPIN_ADDED_MISSING@mx.google.com>

将邮件复制到gmail的imap商店可能会导致邮件ID丢失。例如,请参阅https://productforums.google.com/forum/#!topic/gmail/w5kgRivwbIg(虽然这是非常陈旧的,但它表明将邮件同步到gmail IMAP帐户可能会产生此结果)。

电子邮件的基本规则是,如果电子邮件因任何原因没有消息ID,则会为其创建一个消息ID,这就是此处发生的情况。因此,当您回复时,在回复标题中使用了虚构的消息ID。