我不确定它是否在标题中,但是我正在寻找一种方法来判断我收到的电子邮件是否是对我发送的电子邮件的回复,如果是,只抓取新文本,不是“引用文字”
一点背景:我正在创建一个自动发送电子邮件的脚本。我正在创建一个cron作业,定期运行以检查是否有任何回复。如果有回复,我只想抓住新东西,而不是旧东西。
在过去,我会在主题中发送带有id的电子邮件(你有一个新的回复[1234]),然后检查主题在[和]之间的东西。然后我会抓取所有消息并存储它,因为每个Web浏览器/电子邮件使用不同的字符或样式的引用文本。有些人做“>”有些做横向规则,有些做什么都没有。
无论如何,我只是在电子邮件标题中查找表示他们正在回复的内容以及新文本可能是什么。如果不可能的话,我会继续做我正在做的事情。
答案 0 :(得分:9)
您可以使用In-Reply-To
和References
的组合来确定电子邮件是否是其他电子邮件的回复。
每封电子邮件在其标题Message-ID
中都有唯一的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>
...
当您收到第二封电子邮件时,您可以轻松跟踪之前发送的电子邮件,因为ID
邮件(1)位于邮件的In-Reply-To
标题中(2)。
3- 如果您想在代码中再次回复此电子邮件,只需将Message-ID
邮件(2)放在In-Reply-To
标题中即可Message-ID
标题中的References
邮件(1)和邮件(2)。因此,客户将正确理解链。
... // 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)。
我和他们一起工作并阅读了它们并且它正在运行,我现在的问题是只获取最后一封电子邮件的文本而不是回复中引用的文本。 (我们正在运行自己的票务系统,我们为每封电子邮件创建评论)
答案 1 :(得分:3)
不幸的是,电子邮件客户端基本上可以对您的邮件做任何他们想做的事情,并且没有可靠的标准来确定收到的邮件是如何在客户端发起的。此外,IMAP与它没有任何关系。电子邮件可以通过多种不同的方式发送,包括网络邮件。
你能做的最好的事情就是在主题行中寻找一个身份证号码(假设人们没有改变它,他们很少这样做)。您还可以执行Google所做的操作...模糊地将回复文本与您发送到该地址的电子邮件相匹配。如果匹配,请将其视为回复的一部分。这需要付出很大的努力。