2012-07-24 48 views
1

我想解析使用javax.mail的電子郵件。我想要獲取文本內容和所有附件(最好是INLINE圖片/附件)。如何用javax.mail解析郵件內容?

我有下面的代碼,但它似乎打破了更復雜的郵件與幾個嵌套multiparts。

我已閱讀常見問題解答,並在整個一天內搜索不到解決方案。

請幫忙。

public static String fetchEmailcontent(Part message, String messageid) throws IOException, MessagingException { 

     StringWriter sw = new StringWriter(1024); 

     if (message != null && message.getContent() != null) { 
      if (message.getContent() instanceof Multipart) { 
       Multipart parts = (Multipart) message.getContent(); 
       BodyPart p; 
       boolean alternative = parts.getContentType().trim().toLowerCase().startsWith("multipart/alternative") ? true : false; 

       InputStreamReader isr; 
       int retrieved; 
       char[] buffer = new char[512]; 
       for (int i = 0; i < parts.getCount(); i++) { 
        p = parts.getBodyPart(i); 

        if (p.getContentType().toLowerCase().startsWith("multipart")) { 
         sw.write(fetchEmailcontent(p, messageid)); 
         break; 
        } else if ((Part.INLINE.equalsIgnoreCase(p.getDisposition()) || p.getDisposition() == null) && p.getContentType().toLowerCase().startsWith("text") && p.getFileName() == null) { 

         if (InputStream.class.isInstance(p.getContent())) { 
          InputStream ip = p.getInputStream(); 

          StringWriter subwriter = new StringWriter(ip.available()); 
          isr = new InputStreamReader(ip); 
          while (isr.ready()) { 
           retrieved = isr.read(buffer, 0, 512); 
           subwriter.write(buffer, 0, retrieved); 
          } 
          sw.write(subwriter.toString()); 
         } else { 
          Object content = p.getContent(); 
          if (java.io.ByteArrayInputStream.class.isInstance(content)) { 
           int bcount = ((java.io.ByteArrayInputStream) content).available(); 
           byte[] c = new byte[bcount]; 
           ((java.io.ByteArrayInputStream) content).read(c, 0, bcount); 
           sw.write(new String(c)); 
          } else { 
           sw.write(content.toString()); 
          } 
         } 
         if (alternative && !"".equals(sw.toString().trim())) { 
          break; 
         } 
         sw.write("\r\n"); 
        } else if (p.getDisposition() != null && (p.getDisposition().equalsIgnoreCase(Part.ATTACHMENT) || p.getDisposition().equalsIgnoreCase(Part.INLINE))) { 
         saveFile(MimeUtility.decodeText(p.getFileName()), p.getInputStream(), messageid); 
        } 
       } 
      } else if (message.getContentType().toLowerCase().startsWith("text")) { 
       sw.write(message.getContent().toString()); 
      } 
     } 
     return sw.toString(); 
    } 

這裏有一個郵件的例子未能從獲取附件: (我已刪除頁眉和使用Base64編碼的附件,以節省空間..他們是完全正常的,否則)

Content-Type: multipart/mixed; boundary=f46d04016b4779522904c58fb5b4 

--f46d04016b4779522904c58fb5b4 
Content-Type: multipart/alternative; boundary=f46d04016b4779522104c58fb5b2 

--f46d04016b4779522104c58fb5b2 
Content-Type: text/plain; charset=ISO-8859-1 
Content-Transfer-Encoding: quoted-printable 

test 


sdljpjdpjsd 


=E5=E4=F6 

--f46d04016b4779522104c58fb5b2 
Content-Type: text/html; charset=ISO-8859-1 
Content-Transfer-Encoding: quoted-printable 

<div>test </div><div>=A0</div><div>=A0</div><div>sdljpjdpjsd</div><div>=A0<= 
/div><div>=A0</div><div>=E5=E4=F6</div> 

--f46d04016b4779522104c58fb5b2-- 
--f46d04016b4779522904c58fb5b4 
Content-Type: image/jpeg; name="blah.jpg" 
Content-Disposition: attachment; filename="blah.jpg" 
Content-Transfer-Encoding: base64 
X-Attachment-Id: f_h50rhk180 

BUNCH OF BASE64 
--f46d04016b4779522904c58fb5b4 
Content-Type: application/pdf; name="blah2.pdf" 
Content-Disposition: attachment; filename="blah2.pdf" 
Content-Transfer-Encoding: base64 
X-Attachment-Id: f_h50ria042 

BUNCH OF BASE64 
--f46d04016b4779522904c58fb5b4-- 

預期輸出是郵件正文中的文本,並將所有附件保存到磁盤。 saveFile()函數可以做到這一點,但是它的基本功能我決定不包含它。我當然知道這不是罪魁禍首。

在此先感謝。

+0

您能否向我們提供應該顯示信息的電子郵件?另外,解釋它發現的附件有什麼問題 – 2012-07-24 14:54:34

+0

我在原始文章中附加了電子郵件源。問題是它沒有找到附件。 – 2012-07-24 14:57:24

回答

0

在你的代碼...

if (InputStream.class.isInstance(p.getContent()))可以是假的,但是, InputStream ip = p.getInputStream();仍然可以成功的!

希望這會有所幫助。

+0

我認爲你的答案停在一半。它應該幫助什麼?突出顯示缺少返回值檢查?如果是這樣,就說出來;) – hakre 2012-09-26 08:19:22