知道如果电子邮件是一个回复使用IMAP在PHP



我不确定它是否在标题中,但我正在寻找一种方法来告诉我收到的电子邮件是否是对我发送的电子邮件的响应,如果是这样,只抓取新文本,而不是"引用文本"

一点背景:我正在创建一个脚本,将自动发送电子邮件。我正在创建一个cron作业,以定期运行,以检查是否有任何回复。如果有回复,我只想要新的东西,而不是旧的东西。

在过去,我会发送带有主题id的电子邮件(你有一个新的回复[1234]),然后检查主题中[和]之间的内容。然后我会抓取所有的信息并存储它,因为每个网络浏览器/电子邮件使用不同的字符或样式来引用文本。有的用">",有的用横线,有的什么也不做。

无论如何,我只是在电子邮件标题中寻找一些东西,这将表明他们正在回复和新的文本可能是什么。如果不可能,我会继续做我正在做的事情。

您可以通过使用In-Reply-ToReferences的组合来知道一封邮件是否是另一封邮件的回复。

每封电子邮件都有一个唯一的ID在它的标题叫做Message-ID,根据这个RFC 1,你可以跟踪任何电子邮件的祖先。

我已经检查过了,它可以在所有客户端(Outlook, Thunderbird)中工作
我将给出一个例子。

1-在您第一次发送的电子邮件的标题中,您(您的邮件服务器或您在代码中)发送ID (Message-ID),如果您开放电子邮件的源代码,您将在顶部部分看到它:

... // You (your code) send:
Message-ID: <1@your-domain-mandatory.com>    
...

你只需要在你的程序中保留这个Message-ID。任何后续回复都将引用此ID

2-客户将回复邮件1给你。客户端将发送一个crucial header给你,告诉你这个回复是哪个电子邮件的,除了它自己的Message-ID

... // Client(Thunderbird) send:
Message-ID: <2@your-domain-mandatory.com>    
In-Reply-To: <1@your-domain-mandatory.com>
...

当您收到第二封电子邮件时,您将很容易跟踪您发送的上一封电子邮件,因为邮件(1)的ID在邮件(2)的In-Reply-To标头中。

3- 如果你想在你的代码中再次回复这封邮件,你只需要把邮件(2)的Message-ID放在In-Reply-To头中,把邮件(1)和邮件(2)的Message-ID放在References头中。这样客户端就能正确理解链。

... // You (your code) send:
Message-ID: <3@your-domain-mandatory.com>
In-Reply-To: <2@your-domain-mandatory.com>
References: <1@your-domain-mandatory.com> <2@your-domain-mandatory.com>   
...

通过这个头,你告诉客户端这封邮件是对邮件(2)的回复,并且祖先是邮件(1)和邮件(2)。

我和他们一起工作过,读过他们,它正在工作,我现在的问题是只是得到最后一封电子邮件的文本,而不是从回复中引用的文本。(我们正在运行自己的票务系统,我们为每封电子邮件创建评论)

不幸的是,电子邮件客户机基本上可以对您的消息为所欲为,并且没有可靠的标准来确定接收到的消息是如何从客户机发出的。此外,IMAP实际上与它没有任何关系。电子邮件可以通过多种不同的方式发送,包括网络邮件。

你能做的最好的事情就是在主题行中查找ID号(假设人们不会更改它,但他们很少这样做)。你也可以做谷歌做的事情……模糊匹配您发送到该地址的电子邮件的回复文本。如果匹配,则将其视为回复的一部分。

最新更新