使用Indy IMAP客户端发送电子邮件到达通知(Delphi 2009)

使用Indy IMAP客户端发送电子邮件到达通知(Delphi 2009),delphi,delphi-2009,imap,indy10,Delphi,Delphi 2009,Imap,Indy10,我正在开发一个deamon应用程序,它使用电子邮件收件箱作为输入队列。响应时间应该尽可能高,服务器开销保持在最低限度,因此轮询电子邮件收件箱是不可能的。由于IMAP协议支持新电子邮件上的通知,因此这是应用程序的理想选择 然而,当我尝试在我的Delphi/Indy应用程序中实现这个机制时,我遇到了麻烦。TIdIMAP4工作得很好(除了一些与我的情况无关的Unicode问题),但我找不到在其中实现通知的方法 这应该是一个简单的GIYF问题,但由于一些我不知道的原因,我在网上搜索时找不到有关Indy组

我正在开发一个deamon应用程序,它使用电子邮件收件箱作为输入队列。响应时间应该尽可能高,服务器开销保持在最低限度,因此轮询电子邮件收件箱是不可能的。由于IMAP协议支持新电子邮件上的通知,因此这是应用程序的理想选择

然而,当我尝试在我的Delphi/Indy应用程序中实现这个机制时,我遇到了麻烦。TIdIMAP4工作得很好(除了一些与我的情况无关的Unicode问题),但我找不到在其中实现通知的方法

这应该是一个简单的GIYF问题,但由于一些我不知道的原因,我在网上搜索时找不到有关Indy组件的任何相关信息

如能找到解决办法或替代办法,将不胜感激


编辑:由于Indy显然不支持异步电子邮件通知,有人知道delphi的哪些免费组件可以实现这一点吗。这是另一种解决办法。假设您没有理由希望使用电子邮件(例如,您的信息通过电子邮件来自外部来源),那么我建议使用数据库表来创建输入队列

只需定期轮询数据库即可。这将比轮询电子邮件收件箱快得多,也比你想象的快得多。轮询数据库的速度非常快,您可以轻松地在一分钟内轮询数据库表数百次,而对性能的影响很小

只需创建一个表来存储Q项,并添加一个额外的字段,用于存储时间戳或标记该Q项已被处理,然后只需从堆栈中取出下一个未处理的项

乙二醇 mssql

mysql

然后


数据库速度很快,如果您担心,请运行测试。而且它们比IMAP事件和电子邮件收件箱简单得多。

TIdIMAP4不支持接收异步通知,例如新的电子邮件通知。这需要将TIdIMAP4的实现更改为与TIdTelnet使用的多线程模型类似的多线程模型,但由于TIdIMAP4当前的阻塞命令/响应模型,因此更加复杂。目前,您必须定期轮询收件箱。

为什么不将应用程序设置为smtp服务器,而不是客户端

这样,当电子邮件直接发送到您的应用程序时,您就可以直接收到通知,而不是提取新的电子邮件

虽然我确信ms exchange或postfix等可以设置为很好地使用它,但是有一些备用方法,在您的应用程序关闭时,电子邮件不会排队。

如果电子邮件收件箱(IMAP)是您的体系结构中的基本要求,并且没有可用的IMAP客户端,我会尝试找到一个IMAP客户端,该客户端使用不同语言(C、C#甚至Java)编写异步通知,以实现一个“代理”或网关,当新消息到达时,它将触发您的Delphi守护程序应用程序

Delphi守护进程可以使用简单的基于套接字的协议或http来接收消息(TIdHTTPServer、TIdTCPClient)


如果Indy的学习曲线太陡,你可以用Ararat Synapse TCP/IP库编写一个原型,该库是免费的、开源的,它在我的Delphi 2009应用程序中运行得非常好(除了编译器抱怨一些字符串/ansi转换).

我们一直在考虑,但由于输入首先以电子邮件的形式来自不同的人类用户,所以数据库将是不必要的中间步骤。也有一些数据库实现了队列(Oracle)。它们负责并发性(您的代码不负责,两个进程可以在设置它处理之前获得相同的记录)。还有一种数据库,它允许您向客户端触发事件(Oracle也是这样),而无需连续轮询表。否则,就会出现纯消息队列。
select Top 1 * from tbl_MyQ where AlreadyHandled = 0 
select  * from tbl_MyQ where AlreadyHandled = 0 Limit 1
update tbl_MyQ Set AlreadyHandled = 1 where QueueID = #ItemIDRetrieved#