簡體   English   中英

備用Java客戶端庫到JavaMail?

[英]Alternate Java Client library to JavaMail?

我遇到了一個非常奇怪的問題。 基本上發生的事情是我使用java郵件使用IMAP掃描郵箱,檢查每封電子郵件,查找附件然后閱讀我感興趣的郵件。代碼可以工作......除了在某些Windows 7計算機上,但它適用於大多數W7機器。

奇怪的是異常(見下文)。

com.sun.mail.util.DecodingException: BASE64Decoder: Error in encoded stream: found valid base64 character after a padding character (=), the 10 most recent characters were: "am; name=9"
        at com.sun.mail.util.BASE64DecoderStream.decode(BASE64DecoderStream.java
:305)
        at com.sun.mail.util.BASE64DecoderStream.read(BASE64DecoderStream.java:1
44)
        at java.io.FilterInputStream.read(Unknown Source)

似乎base64解碼流正在嘗試解碼附件,但是開始在部件的標題處讀取base64塊:異常中的“am; name = 9”似乎是標題中的部分名稱文件(以“9”開頭)定義。

從應用程序的日志中復制: “Found attachement 90TXSJ.zip”

我試圖在郵件代碼中找到一個鈎子來獲取InputStream來過濾掉標題的一些方法,但這似乎是不可能的。

那么,是否有另一個不使用Java郵件的IMAP客戶端實現? 或者有誰知道如何在原始流和Base64解碼器之間獲得?

您可能不知道的另一種選擇是Apache JAMES JAMES不允許輪詢IMAP或POP3電子郵件帳戶,而是允許您實施自己的Mailet Mailet是HTTP Servlet的SMTP等價物。

大約十年前,我參與了一個項目,該項目需要集成到企業基礎架構中,並將電子郵件內容自動發布到可搜索的數據庫(選擇加入,以便更容易遵守報告要求)。 我們最初嘗試沿着JavaMail路徑走下去,但我們很快遇到了可伸縮性,安全性約束和健壯性問題。

安裝Apache JAMES並不太困難,我們可以輕松地將更新部署到我們的mailet上。 在我們的例子中,我們將傳入的電子郵件重新打包到我們自己的POJO中,並通過java消息隊列進行序列化。 我們能夠很好地分配實際的處理負載。

Mailet使用您定義的匹配器來確定是否要處理傳入消息。 Matcher使用提供的Mail對象做出決定。 如果匹配器批准該消息,則將其發送給您的mailet進行處理。

Mail對象包含對標准javax.mail.internet.MimeMessage訪問權限,該標准javax.mail.internet.MimeMessage具有解碼消息的getInputStream()getRawInputStream()以獲取發送到服務器的消息。 我們使用這些,因為我們必須提取附件,病毒掃描它們,然后將它們上傳到與正確消息相關聯的可搜索數據庫。

我認為你會發現這種方法更加自由,因為JAMES是一個SMTP服務器,你不必在需要定期清理的收件箱中保存郵件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM