我一直想不通,rfc822 標準都發布多少年了,為什麼還有那麼多不符合規範的email 出現呢?一來也許是伺服器的問題,二來就是不負責任的程式設計師的錯了。所以我突然意識到,不是只有冷血無情的老闆和咄咄逼人的客戶讓程式設計師的身心飽受摧殘,同行的不經意或經意也在加劇著傷害。
我面對著乙份郵件原文發出以上的感慨,客戶抱怨該郵件收到的時候在系統中正文顯示是亂碼。這是乙份典型的不合規範的郵件: content-type : text/plain ,沒有說明 charset,而接下來的正文直接就是未進行任何編碼的中文文字。不過 subject 卻是符合規範的(=?gb2312?b?******x?=)。
行行色色的不合規範的郵件見過不少,最常見的就是某些header未編碼,還有的可能就是,body編碼了而subject 未編碼,最討厭的就是整份email都沒有編碼資訊。
恨歸恨,問題還是得解決,我修改了**,處理邏輯如下:
1. 在最開始解析郵件的時候,先解析某些可能帶有編碼資訊的header,並記錄為 headercharset;部分**如下:
private static pattern encodestringpattern = pattern.***pile("=//?(.+)//?(b|q)//?(.+)//?=", pattern.case_insensitive | pattern.dotall);
private final string chartset_header = new string ;
..........
enumeration enum = message.getmatchingheaderlines(chartset_header);
while (enum.ha**oreelements())
}2. 接著解析郵件體,找到 body 的時候,看看是否指明 charset 資訊;如果指定了,記錄為 bodycharset;如果沒有,使用 headercharset,如果 headercharset 也是 null,使用預設charset。通常是 iso-8859-1。
3. 最後再處理郵件 header,如果沒有charset 資訊,使用 bodycharset,否則使用預設charset。
以上的解決方案,只要郵件的body或者header中的乙個提供了編碼資訊,那麼都可能可以避免亂碼的產生,如果哪份遭千殺的郵件,body 用 gb2312 編碼,subject 卻是未編碼的日文,那我只能長嘆被擊敗了。如果整份郵件都沒有編碼資訊的話,除非你確定郵件都是指定的編碼並進行轉碼,否則只有聽天由命。
最後還是要呼籲一聲,請遵循規範!
解決 Java Mail 接受郵件主題 亂碼
message獲取主題有兩種方式 頭部獲取 message.getheader subject 0 message中獲取 message.getsubject 第二種方法 郵件主題會出現亂碼,但大部分是正常,舉個例子 郵件主題寫成 的 第一種一定不會出現亂碼,下面是第一種列印結果 每一條都指定了編碼...
Java mail學習之郵件基礎
了解相關郵件的基礎知識,才能更好滴編寫郵件,那麼關於郵件有哪些基礎的知識呢?要在internet上提供電子郵件功能,必須具有專門的電子郵件伺服器,就比如我們之前沒有電子郵件之前,使用現實生活中的郵局一樣,我們必須將我們的信件傳送到郵局,然後郵局再次進行 才能達到我們想要的目的地。電子郵件也是同理,電...
java mail傳送郵件
public class mailutil 使用環境屬性和授權資訊,建立郵件會話 session mailsession session.getinstance props,authenticator 建立郵件訊息 mimemessage message new mimemessage mailse...