2012-05-31 57 views
8

代碼發送電子郵件以下內容:如何編碼的互聯網地址

MimeMessage msg = new MimeMessage(session); 
    msg.setSubject("subject", "UTF-8"); // here you specify your subject encoding 
    msg.setContent("yourBody", "text/plain; charset=utf-8"); 

    msg.setFrom("senderAddress"); 
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(address)); 
    Transport.send(msg); 

我probelem是,UTF-8,因爲我已經編碼主題我怎樣才能編碼收件人地址即。 new InternetAddress(address)

+1

爲什麼要編碼收件人地址? –

+0

@MichaelLaffargue:因爲郵件是外文,所以收件人地址 – Romi

+0

@Romi:你從哪裏得到你的電子郵件地址?數據庫或一些屬性文件?是'地址'是一個'字符串'嗎? – HashimR

回答

14

電子郵件地址應遵循RFC822標準

的JavaMail的使用的MimeMessage InternetAddress

此類表示使用 RFC822語法的互聯網電子郵件地址。典型的地址語法格式爲「[email protected]」或 「個人名稱< [email protected]>」。

RFC822 format說:

注意,RFC 822限制字庫ASCII。在 練習中,其他字符(如ä或é)通常在用於註釋目的(和註釋)的字符串中引用,但它們不得在適當的地址中使用,但不得使用 。

的地址個人名稱支持不同的字符集

網際地址使用個人的名字:

如果名稱中包含非US-ASCII字符, 那麼名稱將使用指定的字符集編碼按照RFC 2047.如果該名稱僅包含US-ASCII字符,則不進行編碼,並按原樣使用該名稱。

要設置編碼的字符集,有一個InternetAddress#constructor。縱觀來源:

public InternetAddress(String address, String personal, String charset) 
     throws UnsupportedEncodingException { 
    this.address = address; 
    setPersonal(personal, charset); 
} 

它只是調用setPersonal(..),從而選擇哪個是您最方便的方式。請使用Charset.forName()查詢字符集。

+0

什麼是個人信息,我在地址中顯示的字符不正確 – Romi

+1

@Romi個人姓名是電子郵件地址的名稱,例如:**「ЕвгенийМельник」<[email protected]> **,其中第一部分是名字,第二部分是地址。 – JMelnik

3

我這樣做,其中addressString是NLS字符的電子郵件地址:

InternetAddress address = new InternetAddress(addressString); 
String personal = address.getPersonal(); 
if(personal != null) { 
    address.setPersonal(personal, "utf-8"); 
} 

getPersonal()獲取原料個人姓名(如果有),因爲如果你建造的網際地址與一個字符串,或使用InternetAddress.parse() ,你不會有一個單獨的字符串個人名下部分:

公共java.lang.String中getPersonal()

獲取人名字。如果名稱按照RFC 2047進行編碼,則將其解碼並轉換爲Unicode。如果解碼或轉換失敗,原始數據將按原樣返回。

然後setPersonal()再次設置字符串,但這個時間告訴InternetAddress對它進行編碼:

公共無效setPersonal(java.lang.String中的名字,java.lang.String中的字符集)

設置個人名稱。如果名稱包含非US-ASCII字符,則該名稱將按照RFC 2047使用指定的字符集進行編碼。如果該名稱僅包含US-ASCII字符,則不會進行編碼,並且名稱按原樣使用。

相關問題