2012-12-28 61 views
1

HTML數據,我寫一個應用程序,我獲取信息並檢查它的內容:解析文本/用JavaMail

public void getInhoud(Message msg) throws IOException, Exception { 
    Object contt = msg.getContent(); 
    ... 
    if (contt instanceof String) { 
      handlePart((Part) msg); 
    } 
    ... 
} 

public void handlePart(Part part) 
     throws MessagingException, IOException, Exception { 

    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    String contentType = part.getContentType(); 
    ... 
    if ((contentType.length() >= 9) 
      && (contentType.toLowerCase().substring(
      0, 9).equals("text/html"))) { 
     part.writeTo(out); 
     String stringS = out.toString(); 
    } 
    ... 
} 

我刪除了不必要的代碼。此方法適用於從Gmail,Hotmail和Outlook桌面客戶端發送的電子郵件,但以某種方式無法處理從Office 365 Web客戶端發送的電子郵件。對於其他所有客戶端,內容類型將爲「普通/文本」,但僅適用於Office 365郵件,它將爲text/html。它將Part的數據寫入ByteArrayOutputStream,然後將其轉換爲String。這工作,至少String將包含該部分的內容。但是它包含的HTML有些錯誤。

這裏是一個例子: http://pastebin.com/5mEYCHxD(發佈到Pastebin,它非常大)。

請注意=符號打印在幾乎每一行的末尾。這是我可以在代碼中修復的東西,還是應該放在mailclient的某個地方?

我想過循環遍歷HTML的每一行,並在檢查後刪除=不是HTML標記的一部分。

任何幫助都非常感謝,這已經困擾了我幾個星期了。

謝謝!

回答

1

這聽起來就像quoted printable encoding

引用可打印編碼數據的

電線不能超過76個字符。爲了在不改變編碼文本的情況下滿足這個要求,可以根據需要添加軟換行符。 軟線斷點由編碼行末尾的「=」組成,在解碼後的文本中不會出現換行符。

writeTo方法似乎也寫編碼的內容,看來你得流自行復制。 getInputStream method被描述爲返回解碼的InputStream。

+0

這是一些非常有用的信息,謝謝!我嘗試檢索像這樣的部分的'InputStream': 'InputStream partInput = part.getInputStream(); StringWriter writer = new StringWriter(); IOUtils.copy(partInput,writer); String stringS = writer.toString();'但不知何故'InputStream'是空的,任何想法出了什麼問題? – Jef

+2

請記住,InputStream返回**字節**,但StringWriter寫入**字符**。至少你需要告訴的是用什麼字符編碼來將字節流轉換爲字符流,你可以從該部分的Content-Type的「字符集」參數中獲得。我不知道IOUtils.copy正在做什麼,而是嘗試自己讀取流。 –