【问题标题】:Email Monitor Synchronization电子邮件监视器同步
【发布时间】:2009-05-27 00:51:23
【问题描述】:

我正在编写一个 C# 程序,该程序使用 POP3 监控专用 Gmail 帐户以接收专门的命令电子邮件并做出适当的反应。

为了获得最大的可靠性,我将在全国多台计算机上运行该程序。 我目前有一个竞争条件,程序的两个实例可以在其中一个删除相同的消息之前读取它,导致消息被处理两次。

如何确保每个命令只处理一次?

Gmail 的 POP3 访问过去只为每条消息提供一次(使 RETR 和 DELE 成为单个原子操作),但我无法再重现这种行为。

计算机之间唯一的通信方法是 SQL Server 和 HTTP 服务器(由我控制)。

【问题讨论】:

    标签: c# email synchronization gmail pop3


    【解决方案1】:

    我想到的一个选项是使用 POP3 的 UIDL 命令,并在 SQL Server 中创建一个表,其中包含已处理的唯一 UIDL 列。

    然后,在下载每条消息之前,守护程序会将 UIDL 插入表中,如果出现错误,则跳过该消息。 (我假设 SQL Server 的 INSERT 命令是原子操作)。

    【讨论】:

    • 总而言之,在您必须使用的情况下,这将是唯一可行的解​​决方案。
    【解决方案2】:

    首先我必须承认我不知道 POP3 支持哪些命令,但是...如果您可以执行显式“DELE”并在消息不再存在时得到错误,那么我会说:

    • 撤回消息
    • 删除消息
    • 仅在 DELE 成功时处理

    编辑:

    阅读 RFC1939 后,这种方法应该可行;来自 RFC:

    DELE msg
    
         Arguments:
             a message-number (required) which may NOT refer to a
             message marked as deleted
    
         Restrictions:
             may only be given in the TRANSACTION state
    
         Discussion:
             The POP3 server marks the message as deleted.  Any future
             reference to the message-number associated with the message
             in a POP3 command generates an error.  The POP3 server does
             not actually delete the message until the POP3 session
             enters the UPDATE state.
    
         Possible Responses:
             +OK message deleted
             -ERR no such message
    
         Examples:
             C: DELE 1
             S: +OK message 1 deleted
                ...
             C: DELE 2
             S: -ERR message 2 already deleted
    

    这当然是假设 Gmail 实现实际上遵守 RFC。

    【讨论】:

    • DELE 命令将消息标记为删除。该消息仅在发送 QUIT 后才真正被删除。 (参见 RFC1939)因此,如果两个守护进程删除相同的消息,它们将不会收到任何错误。
    • 感谢您提供的 RFC 编号 ;) ... 可惜没有帮助。
    • 其实……现在阅读RFC,表明在DELE中使用已经标记为已删除的消息号是错误的。如果 Gmail 忠实地实施 RFC1939,我的建议应该会奏效,因为对于已标记为已删除的邮件,您会收到“ERR”响应,而不是“OK”响应。
    • “标记为已删除”状态是每个会话。因此,如果两个不同的会话删除相同的消息,它们不会得到错误。 (我在 telnet 中使用 stunnel 试过这个)
    • 该死...我想这是 RFC 过于含糊而无法谴责任何一种实现的情况...但是您必须遵循实际拥有的情况。
    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2014-07-11
    • 2014-10-26
    • 1970-01-01
    相关资源
    最近更新 更多