2009-05-27 66 views
1

我正在編寫一個C#程序,該程序使用專用命令電子郵件的POP3監控專用的Gmail帳戶並作出適當的反應。電子郵件監控同步

爲了獲得最大的可靠性,我會在全國各地的幾臺電腦上運行該程序。 我目前有一個競爭條件,其中兩個程序實例可以在其中一個程序刪除之前讀取相同的消息,導致消息被處理兩次。

如何確保每個命令只處理一次?

Gmail的POP3訪問過去一次只爲每條消息提供服務(使RETR和DELE成爲單個原子操作),但我無法再重現此行爲。

計算機之間唯一的通信方法是SQL Server和HTTP服務器(我控制)。

回答

1

我想到的一個選擇是使用POP3的UIDL命令,並且在SQL Server中有一個表格,其中包含已處理的唯一UIDL列。

然後,在下載每條消息之前,守護程序會將UIDL插入到表中,如果出現錯誤,則跳過該消息。 (我假設SQL Server的INSERT命令是一個原子操作)。

+0

總而言之,這將是您必須處理的情況下唯一可行的解​​決方案。 – jerryjvl 2009-05-27 14:11:06

+0

C#中的任何示例代碼? – Kiquenet 2010-11-26 06:56:04

0

首先,我必須承認,我不知道是什麼命令POP3支持,但是......如果你可以做一個明確的「DELE」,並得到一個錯誤,如果消息不再存在,那麼我會說:

  • RETR消息
  • 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。