2013-05-31 24 views
2

這裏是我的情況:重新發送MultiPartEmail與Apache公地郵件

  1. 一些電子郵件發送豆被調用了一堆的需要郵件構造參數。
  2. 它創建MultiPartEmail並將它排隊發送,由後臺的獨立線程完成,調用者不關心它是否被髮送。
  3. 遞送線程接收排隊的電子郵件實例並執行email.send() - 如此關閉。
  4. 當交付失敗時,bean會嘗試每5分鐘重新發送郵件三次,然後放棄。

問:

我無法弄清楚如何處理#4。我手邊是先前構建的MultiPartEmail實例,它未能發送。顯然做email.send()再次拋出:

java.lang.IllegalStateException:MimeMessage已經建成。

有沒有辦法重置這個非法狀態,以便消息可以重新使用。我真的沒有辦法從頭開始創建新的實例 - 調用者早已消失,並且它會使整個機制非常難看,而不能使用已經構建的對象。我想我錯過了這裏很簡單的東西..

+1

請下來選民請詳細說明一下? – Dima

回答

5

我看到這是一個老問題,但我只是遇到同樣的問題,我找到了解決方案。

當創建的MultiPartEmail(或HtmlEmail)的實例中,設置其屬性,然後調用send()的方法,該對象將在內部調用以下方法:

  • buildMimeMessage()
  • sendMimeMessage( )

可以多次調用sendMimeMessage(),例如發送重試場景。問題是buildMimeMessage()只能被調用一次。當您依賴基類Emailsend()方法時,您會看到原始海報發現的例外情況。

解決方法是使用我剛剛提到的Email對象爲MultiPartEmail時使用的兩種方法。您明確調用buildMimeMessage()一次,然後調用sendMimeMessage()一次或多次。