2010-04-16 7 views
5

मैं जावा कोड का एक टुकड़ा लिख ​​रहा हूं जिसे गैर-ASCII नाम वाले उपयोगकर्ताओं को मेल भेजने की आवश्यकता है। मैंने यह पता लगाया है कि शरीर, विषय पंक्ति, और जेनेरिक हेडर के लिए यूटीएफ -8 का उपयोग कैसे किया जाए, लेकिन मैं अभी भी प्राप्तकर्ता पर फंस गया हूं।गैर-ASCII नाम वाले प्राप्तकर्ता को javax.mail.internet.MimeMessage भेजें?

यहां "मैं:" फ़ील्ड में मुझे क्या चाहिए: "ウィキペディアにようこそ" <[email protected]>। यह recip नामक एक स्ट्रिंग में (आज हमारे उद्देश्यों के लिए) रहता है।

  • msg.addRecipients(MimeMessage.RecipientType.TO, recip)"忙俾ェ▎S]" <[email protected]>
  • msg.addHeader("To", MimeUtility.encodeText(recip, "utf-8", "B")) फेंकता AddressException: Local address contains control or whitespace in string ``=?utf-8?B?IuOCpuOCo+OCreODmuODh+OCo+OCouOBq+OCiOOBhuOBk+OBnSIgPA==?= =?utf-8?B?Zm9vQGV4YW1wbGUuY29tPg==?=''

कैसे हो मैं इस संदेश को भेजने करना चाहिए देता है?

  • शरीर एचटीएमएल: msg.setText(body, "UTF-8", "html");
  • हेडर:


    यहाँ कैसे मैं अन्य घटकों संभाला है msg.addHeader(name, MimeUtility.encodeText(value, "utf-8", "B"));

  • विषय: msg.setSubject(subject, "utf-8");
+0

संबंधित प्रश्न और समाधान: http://stackoverflow.com/a/5650455/923560 – Abdull

उत्तर

5

ओह, यह एक बेवकूफ का उपयोग कर गया हैक:

/** 
* Parses addresses and re-encodes them in a way that won't cause {@link MimeMessage} 
* to freak out. This appears to be the only robust way of sending mail to recipients 
* with non-ASCII names. 
* 
* @param addresses The usual comma-delimited list of email addresses. 
*/ 
InternetAddress[] unicodifyAddresses(String addresses) throws AddressException { 
    InternetAddress[] recips = InternetAddress.parse(addresses, false); 
    for(int i=0; i<recips.length; i++) { 
     try { 
      recips[i] = new InternetAddress(recips[i].getAddress(), recips[i].getPersonal(), "utf-8"); 
     } catch(UnsupportedEncodingException uee) { 
      throw new RuntimeException("utf-8 not valid encoding?", uee); 
     } 
    } 
    return recips; 
} 

मुझे आशा है कि यह किसी के लिए उपयोगी होगा।

1

मुझे पता है कि यह पुराना है लेकिन यह किसी और की मदद कर सकता है। मुझे समझ में नहीं आता कि इस समाधान के लिए समाधान/हैक कैसे कुछ कर सकता था।

InternetAddress[] recips = InternetAddress.parse(addresses, false); 

और इस निर्माता यहाँ कुछ भी नहीं बदलता है एन्कोडिंग के रूप में व्यक्तिगत नाम (जो इस मामले में शून्य है) पर लागू होता है और नहीं पता:

इस लाइन यहाँ recips [0] के लिए पता स्थापित करेगा ।

new InternetAddress(recips[i].getAddress(), recips[i].getPersonal(), "utf-8"); 

लेकिन नीचे ऐसा कुछ काम करेगा, बशर्ते मेल सर्वर एन्कोडेड प्राप्तकर्ताओं को संभाल सके! (जो अभी तक सामान्य नहीं लगता ....)

recip = MimeUtility.encodeText(recip, "utf-8", "B"); 
InternetAddress[] addressArray = InternetAddress.parse(recip , false); 
msg.addRecipients(MimeMessage.RecipientType.TO, addressArray);