【问题标题】:E-mail arrival notification with Indy IMAP client (Delphi 2009)带有 Indy IMAP 客户端的电子邮件到达通知 (Delphi 2009)
【发布时间】:2010-07-01 20:03:14
【问题描述】:

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

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

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

非常感谢您提供解决方案或替代方法。

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

【问题讨论】:

    标签: delphi delphi-2009 imap indy10


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • 我们一直在考虑这一点,但由于输入首先来自各种人类用户以电子邮件的形式,因此数据库将是一个不必要的中间步骤。
        • 有些数据库也实现了队列(Oracle 实现了)。他们负责并发(您的代码没有,两个进程可以在处理它之前获得相同的记录)。还有一些数据库可以让您向客户端触发事件(同样,Oracle 确实如此),而无需连续轮询表。否则有纯消息队列。
        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-12
          • 1970-01-01
          • 2022-01-13
          • 2013-08-25
          • 2011-05-21
          • 1970-01-01
          相关资源
          最近更新 更多