我正在使用标准的IMAP函数来获取PHP中的电子邮件。我需要跟踪构建线程的每条消息的Message-ID
(以及References
和In-Reply-To
)。一旦部署了这个系统,我希望用户能够回复他们邮件客户端中的消息,以便向线程添加消息,但是在我的Web界面中,回复无法附加到原始帖子,因为我没有来自任何电子邮件标头的In-Reply-To
ID。我会使用In-Reply-To
ID将他们的回复附加到我发给他们的新帖子的通知中,但我不能,因为我无法获取ID。如果我有一个In-Reply-To
标题,则可以对消息进行分组,因为有一个ID连接它们的线程。
此外,我希望能够回复用户发送到服务器电子邮件地址的任何消息,如果他们提交的内容有错误或类似的话,我会需要Message-ID
他们的消息,以便我可以将我发送的消息的In-Reply-To
ID作为回复。
我无法获得Message-ID
和In-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
,其他有价值的标题信息基本上不存在(相反,表示它们的数组值在每种情况下都是空的。)
我几乎可以保证问题不在代码本身,因为我可以在标题中看到一些值,并且我可以成功检索消息体;就像谷歌正在过滤我能看到的标题信息一样。
您可能会注意到我的问题与this page完全相同,但有人建议我提出自己的问题,这就是我所做的。
如果有人可以给我一种方法来回复来自我的服务器的消息而无需检索我正在回复的消息的Message-ID
,那就同样很棒。
我列出了我非常大的收件箱中每封邮件的Message-ID
,从我看到的内容中,大约有40%的ID实际显示出来。如果我再次运行相同的测试,相同的消息将保留其Message-ID
个。我正在搜索显示Message-ID
的消息中的模式,但是有非常强有力的证据表明消息类型之间存在非模式。
实际上,每条消息都有一个Message-ID
(我已经验证了这个消息,即使其ID未显示IMAP查询的消息),但IMAP函数只显示某些消息的ID
答案 0 :(得分:12)
事实证明,标题实际上并没有丢失。当我print_r
这些电话时:
imap_header($this->getImapStream(), "1");
imap_fetch_overview($this->getImapStream(), "1");
imap_fetchheader($this->getImapStream(), "1");
我忽略了使用htmlspecialchars
在其上生成转义字符,这很重要,因为Message-ID
看起来像<lotsOfArbitraryNumbersAndLetters@domain.com>
或类似的东西,我的浏览器认为“嘿,这是一个奇怪的标签,但我会把它视为一个!“
答案 1 :(得分:0)
可能,获取邮件标题的函数在请求它时发送“限制列表”,或者正在使用IMAP协议“ENVELOPE”,因此它不必获取像Received这样的无用标题。喜欢。我保证它们可以被提取,但我怀疑PHP函数由于某种原因没有获取它们。 GMail只是通过MIME消息传递它。
我不认为线程信息包含在ENVELOPE中。
你能做协议追踪吗?如果是这样,我可以帮助您诊断正在发生的事情。