2011-02-04 26 views
25

मैं एक ईमेल भेज रहा हूं और मैं इसे सही तरीके से प्राप्त कर रहा हूं लेकिन विषय का एन्कोडिंग सही नहीं है। मैं "invitación" भेज रहा हूँ लेकिन मुझे "invitaci? N" प्राप्त हो रहा है। संदेश की सामग्री ठीक है।ईमेल भेजने पर विषय एन्कोडिंग के साथ समस्या

संदेश की सामग्री एक वेग चर के परिवर्तन से आ रही है जबकि विषय स्ट्रिंग चर में सेट है।

मैंने चारों ओर गुगल किया है और मैंने देखा है कि कुछ लोग कहते हैं कि MimeUtility.encodeText() समस्या को हल कर सकता है, लेकिन मुझे इसके साथ कोई सफलता नहीं मिली है।

मैं समस्या को कैसे हल कर सकता हूं? यह वह कोड है जो मैंने अभी तक किया है।

String subject = "Invitación"; 
String msgBody = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/vmTemplates/template.vm", "UTF-8", model); 

Properties props = new Properties(); 
Session session = Session.getDefaultInstance(props, null); 

try { 
    String encodingOptions = "text/html; charset=UTF-8"; 
    Message msg = new MimeMessage(session); 
    msg.setHeader("Content-Type", encodingOptions); 
    msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom)); 
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo)); 

    msg.setSubject(subject); 
    msg.setContent(msgBody, encodingOptions); 
    Transport.send(msg); 

    } catch (AddressException e) { 
     ... 
    } catch (MessagingException e) { 
     ... 
    } 

धन्यवाद

उत्तर

41

JavaMail शायद एक छोटे से बहुत ज्यादा अमूर्त है, और आप यहाँ यह करने के लिए शिकार गिरने रहे हैं। जब आप

Message msg = new MimeMessage(session); 

का उपयोग आप एक MimeMessage वस्तु बनाने लेकिन एक Message वस्तु रूप में यह इलाज कर रहे हैं। Message में केवल setSubject(String subject) विधि है, जो विषय को एन्कोड करने के लिए प्लेटफ़ॉर्म डिफ़ॉल्ट वर्णमाला का उपयोग करता है। यदि प्लेटफ़ॉर्म डिफ़ॉल्ट इसे एन्कोड नहीं कर सकता है, तो आपको परिणामी शीर्षलेख में ? वर्ण मिलते हैं। MimeMessage, हालांकि, setSubject(String subject, String charset) विधि है जो आपको उस वर्ण को निर्दिष्ट करने की अनुमति देगी जिसे आप विषय को एन्कोड करने के लिए उपयोग करना चाहते हैं। तो बस अपना कोड

MimeMessage msg = new MimeMessage(session); 
msg.setHeader("Content-Type", encodingOptions); 
msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom)); 
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo)); 

msg.setSubject(subject, "UTF-8"); 

पर स्विच करें और इसे काम करना चाहिए।

+0

'संदेश' का एकमात्र भेजा गया सबक्लास' MimeMessage' है। मैं संदेह कर रहा हूं कि किसी ने भी एक और उप-वर्ग लागू किया है। जावामेल कम गड़बड़ी होगी अगर वे सिर्फ 'javax.mail' और' javax.mail.internet 'को ध्वस्त कर देंगे - अबास्ट्रक्शन की अतिरिक्त परत का मतलब है कि आप लगातार उप-वर्ग में कास्टिंग कर रहे हैं। – dkarp

+0

इसने मेरी समस्या का समाधान नहीं किया (विषय पंक्ति में £ प्रतीक भेजना) –

+1

@ मार्क: आपने 'msg.setSubject (" \ u00a3 "," UTF-8 ") की कोशिश की और यह विषय को ठीक से एन्कोड नहीं किया? परिणामी विषय शीर्षलेख में क्या था? – dkarp

4

शायद तुम कोशिश कर सकते हैं: msg.setSubject(subject, "UTF8");

+1

javax.mail.Message के लिए यह विधि नहीं है। मैं AppEngine द्वारा प्रदान की गई जावा मेल एपीआई का उपयोग कर रहा हूं। – Javi

+0

ओह, क्षमा करें! मैंने देखा नहीं है कि AppEngine से संबंधित है! – ksimon

+0

मैं पहले भूल गया था। मैंने बाद में इसे एपइंजिन के रूप में टैग करने के लिए पोस्ट संपादित किया। फिर भी धन्यवाद। – Javi

6

आप उपयोग कर सकते हैं, यह काम करता है

msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q")); 
0

मेरे मामले केवल एक चीज है जो काम किया है जो वर्ण सेट वांछित समर्थन करने के लिए सिस्टम स्थान बदल रहा है में। इससे पहले मैंने इस धागे से स्वीकृत उत्तर सहित कई अलग-अलग तरीकों की कोशिश की, लेकिन उनमें से कोई भी मदद नहीं की।

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