在邮件到达IMAP服务器时运行PHP脚本

问题描述:

我试图在PHP中实现一个webmail。我想编写一个PHP CLI脚本,该脚本在每个邮件到达时运行,以将部分(不是全部)传入的电子邮件存储到数据库中用于搜索目的。然后,当用户完成搜索并选择要显示的电子邮件时,将与邮件服务器建立连接以检索完整的电子邮件。为了实现这个场景,我需要在数据库和邮件服务器中的电子邮件之间建立某种连接。在邮件到达IMAP服务器时运行PHP脚本

由于我对邮件服务器的使用知识仅限于Zend Framework的API,我相信我需要从IMAP服务器检索电子邮件是message numbermessage unique id(后面的一个似乎不支持所有邮件服务器)。

至此,我设法找到.forward(以及其他一些方法)将我的PHP CLI脚本引入到MTA中,以便在每封邮件到达时运行。这样我可以将电子邮件存储到数据库。但是由于message unique id是由MDA创建的,因此MTA不知道它并且不能提供给我。这意味着稍后当我想从邮件服务器中检索邮件时,我找不到邮件。

最后,这里是我的问题:有没有办法将一个PHP CLI脚本引入到MDA中以用于电子邮件的抵达?如果这取决于邮件服务器,哪些服务器支持这个以及如何?我个人的选择是Dovecot或Courier,但任何其他邮件服务器都可以。

+0

*使用邮件服务器仅限于Zend Framework的API *不正确。你不能使用PHP的IMAP功能吗? – Raptor 2013-05-03 06:43:42

+0

我没有说“使用邮件服务器仅限于Zend Framework的API”。我说我的知识仅限于Zend Framework的API! – Mehran 2013-05-03 06:45:05

似乎不可能将这样一个PHP CLI脚本引入IMAP服务器(至少我确信Dovecot)。无论如何,我发现这个问题的工作是使用我自己的PHP脚本将新邮件插入IMAP服务器并检索其ID并将该ID存储在数据库中以备将来参考。要明确,电子邮件是由MTA给我的PHP CLI脚本,而不是MDA。正如我之前所说,这是使用.forward文件轻松完成的。

[UPDATE]

不幸的是,似乎这个解决方案也不能实现。向IMAP服务器插入新电子邮件的方法是APPEND命令,并且最近添加的邮件服务器的UID必须支持UIDPLUS扩展名。目前Dovecot和Courier都不支持这种扩展!如果他们这样做,似乎服务器将返回UIDAPPENDUID响应。

[更新]

这是我的坏,因为快递不支持UIDPLUS。所以这个解决方案是有效的,我将要实现的。

+0

什么?两台服务器都支持UIDPLUS。 – Max 2013-05-03 18:25:20

+1

我的快递服务器登录时的性能响应:''* OK [CAPABILITY IMAP4rev1 *** UIDPLUS *** CHILDREN NAMESPACE THREAD = ORDEREDSUBJECT THREAD = REFERENCES SORT QUOTA IDLE ACL ACL2 = UNION STARTTLS] Courier-IMAP就绪。版权所有1998-2008 Double Precision,Inc.请参阅COPYING获取发行信息。'' – Max 2013-05-03 18:26:03

+0

我在我的机器上安装了Dovecot,我确信它不支持'UIDPLUS'。这里是[Dovecot的维基页面](http://wiki2.dovecot.org/FeatUIDPLUS),它没有提及Dovecot是否计划支持它! – Mehran 2013-05-04 04:20:42

这很棘手 - 关于如何设置交付有很多方法。它们中的一些直接使用底层邮件存储,完全绕过你的IMAP服务器,而另一些则使用例如鸽舍的设施。

您是否考虑过在Dovecot附带的notify插件之上构建?

+1

你能告诉我这个'notify'插件是如何工作的吗?我已阅读[Dovecot的维基页面](http://wiki2.dovecot.org/Plugins/Notify),但它几乎没有任何说法。 – Mehran 2013-05-03 12:24:05

+0

您需要了解C并查看插件来源。 – 2013-05-04 20:00:24

+0

谢谢,但我发现周围的工作更简单和可行。 – Mehran 2013-05-05 05:13:09