Gmail IMAP通过php oauth2 Zend_Mail_Protocol_Exception - 获取X-GM-THRID

时间:2013-02-01 16:15:07

标签: gmail imap zend-mail

我正在使用OAuth2身份验证和Zend_Mail_Protocol_Imap通过IMAP访问GMail。

一切都很好。

我需要做的是以线程形式呈现电子邮件,就像GMail界面一样。谷歌使这一点非常简单,因为它们有一个X-GM-THRID标题,用于将对话与64位无符号整数相关联。

我的问题是:当出现一封电子邮件时,如何找出它所属的X-GM-THRID

Google首先说有一个活跃的服务器扩展程序X-GM-EXT-1。您可以使用CAPABILITY命令检查它是否存在(我有)。

所有信息都表明,如果这是有效的,那么X-GM-THRID将只是作为标题返回,但事实并非如此。

也许我需要让Google通过fetch命令返回它。 Google确实在这里描述了一个简单的获取过程:

https://developers.google.com/google-apps/gmail/imap_extensions

我的代码正在发送TAG5 FETCH 3673 (FLAGS RFC822.HEADER X-GM-THRID),但标题中不包含X-GM-THRID的条目。

我甚至将它简化为TAG6 FETCH 3673 (X-GM-THRID),完全如google示例中所述。在这种情况下,不会返回任何标头。

我并不是非常熟悉IMAP命令,我不确定Zend_Mail_Protocol_Imap是否正在抽象某些处理,这意味着正在删除此标题。

但我知道这让我很生气。

我错过了什么吗?这不是标题吗?

1 个答案:

答案 0 :(得分:3)

好的,所以看起来它不是标题。它是IMAP命令和响应中的一个属性。

Zend_Mail_Protocol_Imap发送的标准fetch命令是“TAG5 FETCH 3673(FLAGS RFC822.HEADER)”

处理响应的代码只能处理'FLAGS'和'RFC822.HEADER'。它将此信息传递给Zend_Mail_Message对象,该对象扩展了Zend_Mail_Part。

Zend_Mail_Part解析有关标志的信息。它还解析标题。

我添加的额外“X-GM-THRID”属性实际上得到了响应。但由于它没有传回Zend_Mail_Message,我无法使用它。它在以太中丢失(确切地说,在Zend Library中Zend_Mail_Storage_Imap的第171行附近)。

所以我已经破解了核心...... Zend_Mail_Storage_Imap :: getMessage现在需要$ data ['X-GM-THRID']并将其传递给构造函数Zend_Mail_Part。我现在有一个方法Zend_Mail_Part :: getXGmThrid,它解决了我所有的问题。我显然会将它们重构到我自己的类中,在不太遥远的范围内扩展Zend_Mail_Storage_Imap和Zend_Mail_Part ......但是现在我知道这很有效。