我正在使用使用电子邮件收件箱作为输入队列的Deamon应用程序。响应时间应尽可能高,而服务器开销将其保持在最低限度,因此投票电子邮件收件箱不可行。由于IMAP协议启用了有关新电子邮件的通知,因此这是应用程序的理想选择。

但是,当我尝试在Delphi/Indy应用程序中实现此机制时,我会遇到麻烦。 tidimap4效果很好(除了我的情况下,除了一些无关紧要的Unicode问题外),但我找不到实施通知的方法。

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

解决方案或替代方法将不胜感激。

编辑:由于Indy似乎不支持异步电子邮件通知,因此有人知道Delphi的免费组件是否可以实现这一目标。

有帮助吗?

解决方案

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

其他提示

为什么不将应用程序成为SMTP服务器,而不是客户端。

这样,您会直接通知,因为电子邮件直接发送到您的应用程序,而不是撤回新电子邮件。

有几个后备,在该电子邮件中,如果您的应用程序停止,则不会排队,尽管我确定可以设置MS Exchange或Postfix等可以很好地使用它。

行。这是一个替代解决方案。假设您没有理由使用电子邮件(例如,您的信息通过电子邮件构成外部来源),那么我建议一个数据库表是创建输入队列的一种更简单的方法。

只需定期对数据库进行轮询。这要比轮询电子邮件收件箱要快得多,而且比您想象的要快得多。对数据库进行轮询非常快,您可以轻松地对数据库表轻松进行几百次投票,而对性能的影响很小。

只需创建一个表即可存储Q项目并添加一个额外的字段,您可以存储该Q项目已处理的时间戳或标志,然后您只需将下一个未经处理的项目从堆栈中取出

例如MSSQL

select Top 1 * from tbl_MyQ where AlreadyHandled = 0 

mysql

select  * from tbl_MyQ where AlreadyHandled = 0 Limit 1

然后

update tbl_MyQ Set AlreadyHandled = 1 where QueueID = #ItemIDRetrieved#

数据库很快,如果担心,请进行测试。它们比IMAP事件和电子邮件收件箱要复杂得多。

如果电子邮件收件箱(IMAP)是您的架构中的基本要求,并且没有IMAP客户端,我会尝试找到一个以不同语言(C,C#甚至Java)编写的异步通知的IMAP客户端来实现'当新消息到达时,代理或网关将触发您的Delphi Daemon应用。

Delphi守护程序可以使用简单的基于套接字的协议或HTTP接收消息(Tidhttpserver,TidtcpClient)。

如果Indy的学习曲线陡峭,您可以使用Ararat Synapse TCP/IP库编写原始的,该曲线是免费和开源的,它在我的Delphi 2009应用程序中很好地工作(除了编译器抱怨某些字符串/ANSI,转换)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top