2012-05-31 15 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

@ माइकललाफर्ग्यू: चूंकि मेल विदेशी भाषा में है, इसलिए प्राप्तकर्ता का पता – Romi

+0

@ रोमी: आपको अपना ईमेल पता कहां से प्राप्त हो रहा है? डेटाबेस या कुछ संपत्ति फ़ाइल? 'पता' एक 'स्ट्रिंग' है? – HashimR

उत्तर

14

ईमेल पता RFC822 मानक

JavaMail के MimeMessage का पालन करना चाहिए InternetAddress उपयोग करता है:

इस वर्ग के एक इंटरनेट ईमेल RFC822 की सिंटेक्स के उपयोग का पता प्रतिनिधित्व करता है। विशिष्ट पता वाक्यविन्यास "[email protected]" या "व्यक्तिगत नाम < [email protected]>" फ़ॉर्म का है।

RFC822 format का कहना है:

ध्यान दें कि RFC 822 ASCII के चरित्र प्रदर्शनों की सूची को सीमित करता है। अभ्यास में, अन्य वर्ण (जैसे ä या é) आम तौर पर टिप्पणियों के उद्देश्यों (और टिप्पणियों) के लिए उपयोग किए गए तारों के अंदर काम करते हैं, लेकिन उन्हें उचित पते में उपयोग नहीं किया जाना चाहिए। पते के लिए

व्यक्तिगत नाम अलग किए गए वर्णसेट

का समर्थन करता है

InternetAddress एक व्यक्तिगत नाम का उपयोग करता है: नाम गैर US-ASCII वर्ण हैं, तो

तो नाम निर्दिष्ट चारसेट का उपयोग कर इनकोडिंग किया जाएगा आरएफसी 2047 के अनुसार। यदि नाम में केवल यूएस-एएससीआईआईआई अक्षर हैं, तो कोई एन्कोडिंग नहीं की जाती है और नाम का उपयोग इस प्रकार किया जाता है।

एन्कोडिंग के लिए वर्ण सेट सेट करने के लिए, InternetAddress#constructor है। सूत्रों को देखते हुए:

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

यह सिर्फ setPersonal(..) कहता है, इस प्रकार जिस तरह आप के लिए सबसे सुविधाजनक है चुनें।

एक वर्णमाला देखने के लिए, Charset.forName() का उपयोग करें।

+0

व्यक्तिगत क्या है, मेरे पास पते में विशेष char है जो सही ढंग से प्रदर्शित नहीं हो रहा है – Romi

+1

@ रोमी व्यक्तिगत नाम ईमेल पते का नाम है, उदाहरण के लिए: ** "Евгений Мельник" <[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 का निर्माण, या InternetAddress.parse() का उपयोग कर)

सार्वजनिक java.lang.String getPersonal (

व्यक्ति प्राप्त करें:, तो आपको एक अलग स्ट्रिंग में व्यक्तिगत नाम हिस्सा नहीं होगा अल नाम यदि नाम आरएफसी 2047 के अनुसार एन्कोड किया गया है, तो इसे डीकोड किया गया है और यूनिकोड में परिवर्तित किया गया है। यदि डिकोडिंग या रूपांतरण विफल रहता है, तो कच्चे डेटा को वापस लौटा दिया जाता है।

फिर setPersonal() फिर से वापस स्ट्रिंग सेट लेकिन इस बार InternetAddress कह यह सांकेतिक शब्दों में बदलना करने के लिए:

सार्वजनिक शून्य setPersonal (java.lang.String नाम, java.lang.String चारसेट)

व्यक्तिगत नाम सेट करें। यदि नाम में गैर यूएस-एएससीआईआईआई अक्षर हैं, तो नाम आरएफसी 2047 के अनुसार निर्दिष्ट वर्णसेट का उपयोग करके एन्कोड किया जाएगा। यदि नाम में केवल यूएस-एएससीआईआईआई अक्षर हैं, तो कोई एन्कोडिंग नहीं की जाती है और नाम का उपयोग इस प्रकार किया जाता है।

संबंधित मुद्दे