2013-07-06 64 views
0

我正在寫一個郵件發送程序。它從隊列中讀取郵件並從隊列中發送刪除之後。如何避免發送多份郵件

所以過程看喜歡:從隊列

    1. 讀一個郵箱發送郵件
    2. 刪除郵件從隊列

    如果應用程序崩潰第2步後,由於一些編程錯誤或由於網絡錯誤,我無法從隊列中刪除郵件。我最終發送郵件的多個副本。

    有沒有辦法避免發送郵件的副本?生成獨特的散列並添加自定義標頭。並檢查是否有任何郵件具有相同的標題值。

  • +0

    你能命名你的操作系統嗎?你使用哪個MTA /郵件服務器? – AnFi

    +0

    @ AndrzejA.Filip 郵件服務器是用戶的選擇。他可以選擇任何smtp服務器來發送郵件。 (像Gmail一樣)。 –

    +0

    **某些**可能的解決方案是「第一個MTA」的依賴。 – AnFi

    回答

    0

    由於不存在查詢郵件系統以查找特定郵件(例如,具有特定標頭或散列值)是否已經發送的情況,所以沒有任何方法可以做到這一點。

    郵件傳遞軟件應該認爲,發送重複郵件比根本沒有發送排隊郵件要好。

    您當然可以採取儘可能多的步驟來幫助您的應用程序在發生錯誤和崩潰時健壯地運行,包括確保您捕獲應用程序的所有例外情況並讓孩子參與工作,同時使父級監視器它等等......基本上盡一切合理的努力在郵件被確認發送後儘快將郵件出列(希望這是簡單的操作,不能輕易失敗,例如簡單的unlink())。

    即使這樣,即使你的程序沒有任何錯誤,網絡仍然可以咬你。如果您發送郵件,但您從未收到SMTP DATA命令的迴應(說因爲此時網絡連接已中斷),是否發送了電子郵件?這是不可能知道的。你應該離隊嗎?

    相關問題