6

我正在使用标准 IMAP 函数在 PHP 中获取电子邮件。我需要跟踪每条消息的Message-ID(and Referencesand In-Reply-To) 以构建线程。部署此系统后,我希望用户能够在其邮件客户端中回复消息以将消息添加到线程中,但在我的 Web 界面中,回复无法附加到原始帖子,因为我没有In-Reply-To来自任何电子邮件标头的ID。我会使用In-Reply-ToID 将他们的回复附加到我发送给他们的新帖子通知中,但我不能,因为我无法获得 ID。如果我有一个In-Reply-To标题,则可以对消息进行分组,因为有一个 ID 线程连接它们。

此外,我希望能够回复用户发送到服务器电子邮件地址的任何消息,如果他们的提交有错误或类似的东西,在这种情况下,我需要Message-ID他们的消息,以便我可以制作我作为回复发送的消息的In-Reply-ToID。

我无法获得 的值Message-IDIn-Reply-To即使它们实际上具有值。(转到Gmail中的任何消息,单击回复按钮旁边的下拉菜单,点击“显示原始”,您会看到我调用IMAP函数时缺少的所有标题信息实际上都在那里,如尽管 Gmail 不想将该信息提供给 IMAP 服务器。)

我已经尝试了各种可以获取标头信息(imap_headerinfo, imap_fetchheader, imap_fetch_overview)的调用,但它们都返回了我不需要的标头信息的稀疏值数组。执行后

$this->mbox = imap_open('{imap.gmail.com:993/imap/ssl}', $email, $password);

通过以下任何调用,我只能从标头中获取一些有用的值:

imap_header($this->getImapStream(), "1");
imap_fetch_overview($this->getImapStream(), "1");
imap_fetchheader($this->getImapStream(), "1");

我可以看到诸如Subject, To,Reply-To和其他标头值之类的东西,它们都是准确的,但是Message-ID, References,In-Reply-To和其他有价值的标头信息基本上不存在(相反,代表它们的数组值在每种情况下都是空的)。

我几乎可以保证问题不在于代码本身,因为我可以在标题中看到一些值,并且我可以成功检索消息的正文;就好像谷歌正在过滤我可以看到的标题信息。

您可能会注意到我的问题与此页面上的问题完全相同,但有人建议我提出自己的问题,所以这就是我所做的。


编辑

如果有人可以给我一种方式来回复来自我的服务器的消息,而无需检索Message-ID我正在回复的消息,那同样很棒。


编辑 2

我在我非常大的收件箱中列出了Message-ID每条消息的来源,据我所见,实际显示了大约 40% 的 ID。如果我再次运行相同的测试,相同的消息会保留它们Message-ID的 s。我正在搜索显示的消息中的模式,Message-ID但有非常有力的证据表明消息类型中存在非模式。

实际上,每条消息都有一个Message-ID(我已经验证了即使是 IMAP 查询中没有显示 ID 的消息),但 IMAP 函数只显示一些消息的 ID。

4

2 回答 2

13

事实证明,标题实际上并没有丢失。当我print_r接听这些电话时:

imap_header($this->getImapStream(), "1");
imap_fetch_overview($this->getImapStream(), "1");
imap_fetchheader($this->getImapStream(), "1");

我忽略了在它们上生成转义字符htmlspecialchars,这很重要,因为Message-IDs 看起来有点像<lotsOfArbitraryNumbersAndLetters@domain.com>或接近它,我的浏览器认为“嘿,这是一个奇怪的标签,但我会像对待它一样对待它!”

于 2013-07-19T19:21:44.047 回答
0

很可能,获取消息标头的函数在请求它们时会发送“限制列表”,或者正在使用 IMAP 协议“ENVELOPE”,因此它不必获取 Received 等无用的标头。我保证它们可以被获取,但我怀疑 PHP 函数由于某种原因没有获取它们。GMail 只是在收到 MIME 消息时通过它。

我认为信封中不包含线程信息。

你能做一个协议跟踪吗?如果是这样,我可以帮助您诊断发生了什么。

于 2013-07-18T20:35:25.680 回答