Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
知道电子邮件是否是在PHP中使用IMAP的回复_Php_Email_Imap_Pop3 - Fatal编程技术网

知道电子邮件是否是在PHP中使用IMAP的回复

知道电子邮件是否是在PHP中使用IMAP的回复,php,email,imap,pop3,Php,Email,Imap,Pop3,我不确定它是否在标题中,但我正在寻找一种方法来判断我收到的电子邮件是否是对我发送的电子邮件的响应,如果是,则只获取新文本,而不是“引用文本” 一点背景:我正在创建一个脚本,它将自动发送电子邮件。我正在创建一个cron作业,定期运行,以检查是否有回复。如果有回复,我只想抓住新的东西,而不是旧的东西 在过去,我会发送主题中带有id的电子邮件(您有一个新的回复[1234]),然后检查主题中[and]之间的内容。然后我会抓取所有的信息并存储起来,因为每个网络浏览器/电子邮件都会使用不同的字符或样式来引用

我不确定它是否在标题中,但我正在寻找一种方法来判断我收到的电子邮件是否是对我发送的电子邮件的响应,如果是,则只获取新文本,而不是“引用文本”

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

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


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

不幸的是,电子邮件客户端基本上可以对您的邮件执行任何他们想要的操作,并且没有可靠的标准来确定接收到的邮件是如何在客户端发出的。此外,IMAP实际上与此无关。电子邮件可以通过多种不同的方式发送,包括网络邮件


你能做的最好的事情就是在主题行中寻找一个ID号(假设人们不改变它,而他们很少这样做)。你也可以像谷歌那样做。。。将回复文本与您发送到该地址的电子邮件进行模糊匹配。如果匹配,则将其视为回答的一部分。不过这需要很大的努力。

您可以通过在回复和
参考
时结合使用
,来知道一封电子邮件是否是另一封电子邮件的回复

每个电子邮件的标题中都有一个唯一的ID,名为
消息ID
,根据此RFC,您可以跟踪任何电子邮件的祖先

我已经检查了它,并且它在所有客户端(Outlook、Thunderbird)中都正常工作
我将举一个例子来使用。

1-在您第一次发送的电子邮件的标题中,您(您的邮件服务器或代码中的您)发送了一个
ID(邮件ID)
,如果您打开电子邮件的源代码,您将在顶部看到如下内容:

... // You (your code) send:
Message-ID: <1@your-domain-mandatory.com>    
...
当您收到第二封电子邮件时,您可以很容易地跟踪您之前发送的电子邮件,因为邮件(1)的
ID
位于回复邮件(2)的
标题中

3-如果您想在代码中再次回复此电子邮件,您只需将邮件(2)的
邮件ID
放入
回复
标题,将邮件(1)和邮件(2)的
邮件ID
放入
参考
标题。因此,客户将正确理解该链

... // 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>   
...
..//您(您的代码)发送:
消息ID:
答复:
参考资料:
...
通过此标题,您告诉客户此电子邮件是对邮件(2)的回复,其祖先是邮件(1)和邮件(2)


我已经和他们一起工作过,并且读到了关于他们的信息,这是有效的,我现在的问题是只获取最后一封电子邮件的文本,而不是从回复中引用的文本。(我们正在运行自己的票务系统,我们为每封电子邮件创建一条评论)

是的,这就是我的想法,尤其是在检查回复时。这将很难做到,因为每个网络邮件/电子邮件客户端都不同,发送数据的方式也不同。谢谢有时也会有标题。标头将作为回复或类似内容读取,并将包含原始邮件的邮件ID。@SteveSmith,不要求客户端发送它。你会经常看到它,但并非总是如此。@Brad绝对如此,这就是我有时说的原因,但如果你把所有这些加在一起,你就有希望使它更健壮一些,以防客户端编辑主题行。“回复”标题的长度没有确定的最大长度,所以当我存储它时,我只存储它的sha256散列(32字节)。我并不真的想解析它-我只需要做一个查找,看看它是否与我发送的电子邮件匹配。我没有收到你的邮件。那么,问题出在哪里?无论你是以普通还是散列形式存储它,你仍然可以对其进行比较。如果你存储了你发送的每个邮件id,那么当你收到一封电子邮件时,只需比较这两个纯文本或比较其散列两者都使用适当的方法(也许你在问如何比较两个哈希值?)我之所以这么做,是因为对令牌的长度似乎没有官方限制。理论上它可能有995个字符长。我确信平均长度要小得多,但我决定立即使用散列。如果它对您有效,就可以了。在我们的例子中,我们只使用普通模式,这对我们很好。顺便说一句,它很有趣知道你的方式。我没有看到任何对这个答案的赞成票,但是这个答案似乎很合法
... // 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>   
...