Java Mail無法解析帶分號的收件者清單的問題

來源:互聯網
上載者:User

Java Mail無法解析帶分號的收件者清單的問題

      今天同事碰到一個問題,使用JAVA MAIL收取郵件時,如果收件者是個列表,且收件者清單是以分號進行分割的,則JAVA MAIL就會出現異常,不能正常解析,抽空看了一眼,自己寫了個簡單demo,很簡單,例如:

  @Test<br /> public void testReceiveMail() {</p><p> try {<br /> String host = "pop3.163.com";<br /> Properties pops = new Properties();<br /> pops.put("mail.pop3.host", host);<br /> pops.put("mail.pop.auth", "true");<br /> Session session = Session.getDefaultInstance(pops, null);<br /> Store store = session.getStore("pop3");<br /> //串連郵件伺服器<br /> store.connect(host, "chb_go", "3870359346");<br /> //收取收件匣<br /> Folder inbox = store.getDefaultFolder().getFolder("INBOX");<br /> //唯讀足夠了<br /> inbox.open(Folder.READ_ONLY);<br /> //得到所有郵件清單<br /> Message[] msg = inbox.getMessages();<br /> FetchProfile profile = new FetchProfile();<br /> profile.add(FetchProfile.Item.ENVELOPE);<br /> inbox.fetch(msg, profile);<br /> for (int i = 0; i < msg.length; i++) {<br /> System.out.println("===============================================");<br /> System.out.println("主題:"+msg[i].getSubject());<br /> InternetAddress[] toAddress = (InternetAddress[]) msg[i].getRecipients(Message.RecipientType.TO);<br /> for(InternetAddress adress:toAddress){<br /> System.out.println(adress.getAddress());<br /> }<br /> }<br /> //關閉開啟的資源<br /> if (inbox != null)<br /> inbox.close(true);<br /> if (store != null)<br /> store.close();<br /> } catch (NoSuchProviderException e) {<br /> e.printStackTrace();<br /> } catch (MessagingException e) {<br /> e.printStackTrace();<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> }<br /> }        很簡單,可以正常收取郵件、正常顯示收件者清單;但是當串連一個內部郵件伺服器,並且收件者是以分號為分隔字元的郵件時,確實無法正常顯示收件者。      尋找了一下規範,發現FRC 822規定:收件者之間是要求以逗號為分割,看來分號分割不是標準的分隔字元,如下:destination = "To" ":" 1#address ; Primary
/ "Resent-To" ":" 1#address / "cc" ":" 1#address ; Secondary / "Resent-cc" ":" 1#address / "bcc" ":" #address ; Blind carbon / "Resent-bcc" ":" #address
而#文法表示一個列表,列表之間的內容以逗號進行分割,例如:2.7. #RULE: LISTS A construct "#" is defined, similar to "*", as follows: <l>#<m>element indicating at least <l> and at most <m> elements, each separated by one or more commas (","). This makes the usual form of lists very easy; a rule such as '(element *("," element))' can be shown as "1#element". Wherever this construct is used, null elements are allowed, but do not contribute to the count of elements present. That is, "(element),,(element)" is permitted, but counts as only two elements. Therefore, where at least one ele- ment is required, at least one non-null element must be present. Default values are 0 and infinity so that "#(element)" allows any number, including zero; "1#element" requires at least one; and "1#2element" allows one or two. JAVA MAIL嚴格按照RFC 822規範進行操作,沒有對分號做處理。大多數郵件伺服器都是嚴格遵循RFC 822規範的,比如Lotus Notes、gmail(gmail的收件者是不能輸入分號的,甚至會自動替換成逗號,贊一個);但是,大家也會發現平時發送郵件,經常以分號做分割,這是因為微軟的一些郵件工具,如:outlook、outlook Express或是其MAPI,則是以分號為分隔字元的,又因為outlook使用使用者非常廣泛,甚至很多人會認為分號分隔才是規範,強烈鄙視Microsoft!不規範的東西太多了!!       如果足夠倒黴,真的碰到了習慣使用分號作為分割符的使用者,而其郵件伺服器又不會自動將分號替換為逗號,那我們只能通過程式做相容了,可以考慮修訂JAVA MAIL源碼,修改InternetAddress類的parse方法,這裡源碼就不展現了,大家只需將對於分號的處理修改成和逗號一樣即可(但是分號在FRC 822中也有定義,這麼修改有可能引起隱患,大家謹慎)。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.