4

我正在开发一个使用电子邮件收件箱作为其输入队列的守护程序应用程序。响应时间应该尽可能长,同时服务器开销保持在最低限度,因此轮询电子邮件收件箱是不可能的。由于 IMAP 协议启用新电子邮件通知,这对于应用程序来说是理想的。

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

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

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

编辑:由于 Indy 似乎不支持异步电子邮件通知,有谁知道 delphi 的哪些免费组件可以实现这一点。

4

4 回答 4

4

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

于 2010-07-02T06:57:47.850 回答
2

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

通过这种方式,您可以在电子邮件直接发送到您的应用程序时获得直接通知,而不是提取新电子邮件。

有一些后备方案,如果您的应用程序出现故障,该电子邮件将不会排队,尽管我确信可以设置 ms exchange 或 postfix 等以很好地使用它。

于 2010-07-02T07:24:44.693 回答
0

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

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

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

于 2010-07-06T15:51:18.717 回答
0

好的。这是一种替代解决方案。假设您没有理由希望使用电子邮件(例如,您的信息是通过电子邮件从外部来源获得的),那么我建议使用数据库表作为创建输入队列的更直接的方法。

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

只需创建一个表来存储您的 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 事件和电子邮件收件箱要简单得多。

于 2010-07-01T23:25:08.703 回答