2008-11-26 1 views
18

से दृष्टिकोण के लिए एचटीएमएल ईमेल कैसे भेजें I जावामेल का उपयोग कर एचटीएमएल प्रारूप में एक ईमेल भेजने की कोशिश कर रहा हूं लेकिन यह हमेशा Outlook में टेक्स्ट ईमेल के रूप में प्रदर्शित होता है।जावा

यहाँ मेरी कोड है:

try 
{ 
    Properties props = System.getProperties(); 
    props.put("mail.smtp.host", mailserver); 
    props.put("mail.smtp.from", fromEmail); 
    props.put("mail.smtp.auth", authentication); 
    props.put("mail.smtp.port", port); 
    Session session = Session.getDefaultInstance(props, null);  

    // -- Create a new message -- 
    MimeMessage message = new MimeMessage(session); 

    // -- Set the FROM and TO fields -- 
    message.setFrom(new InternetAddress(fromEmail, displayName)); 
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false)); 

    MimeMultipart content = new MimeMultipart(); 
    MimeBodyPart text = new MimeBodyPart(); 
    MimeBodyPart html = new MimeBodyPart(); 

    text.setText(textBody); 
    text.setHeader("MIME-Version" , "1.0"); 
    text.setHeader("Content-Type" , text.getContentType()); 

    html.setContent(htmlBody, "text/html"); 
    html.setHeader("MIME-Version" , "1.0"); 
    html.setHeader("Content-Type" , html.getContentType()); 

    content.addBodyPart(text); 
    content.addBodyPart(html); 

    message.setContent(content); 
    message.setHeader("MIME-Version" , "1.0"); 
    message.setHeader("Content-Type" , content.getContentType()); 
    message.setHeader("X-Mailer", "My own custom mailer"); 

    // -- Set the subject -- 
    message.setSubject(subject); 

    // -- Set some other header information -- 
    message.setSentDate(new Date()); 

    // INFO: only SMTP protocol is supported for now... 
    Transport transport = session.getTransport("smtp"); 
    transport.connect(mailserver, username, password); 
    message.saveChanges(); 

    // -- Send the message -- 
    transport.sendMessage(message, message.getAllRecipients()); 
    transport.close(); 

    return true; 

} catch (Exception e) { 
    LOGGER.error(e.getMessage(), e); 
    throw e; 
}  
कोई भी विचार क्यों ईमेल के HTML संस्करण Outlook में प्रदर्शित नहीं होगी

?

+0

मैंने अपने उत्तर को एक नए विचार के साथ अपडेट किया। – erickson

+0

@ एरिक्सन: आपके उत्तर पर उपरोक्त मेरे पास है;) –

उत्तर

16

बहुत सी जांच के बाद, मैं कुछ महत्वपूर्ण प्रगति करने में सक्षम हूं।

सबसे पहले, सीधे जावामेल का उपयोग करने के बजाय, मैं Jakarta Commons Email लाइब्रेरी का उपयोग करने की सलाह देता हूं। यह वास्तव में इस मुद्दे को बहुत सरल बनाता है!

कोड है:

HtmlEmail email = new HtmlEmail(); 

email.setHostName(mailserver); 
email.setAuthentication(username, password); 
email.setSmtpPort(port); 
email.setFrom(fromEmail); 
email.addTo(to); 
email.setSubject(subject); 

email.setTextMsg(textBody); 
email.setHtmlMsg(htmlBody); 

email.setDebug(true); 

email.send(); 

के बारे में सरल बात करें।

हालांकि, अभी भी एक मुद्दा है। ईमेल का एचटीएमएल संस्करण जीमेल, हॉटमेल इत्यादि में बहुत अच्छा काम करता है लेकिन यह अभी भी Outlook में सही तरीके से प्रदर्शित नहीं होगा। यह हमेशा टेक्स्ट संस्करण प्रदर्शित करना चाहता है और मुझे यकीन नहीं है कि क्यों। मुझे संदेह है कि यह Outlook में एक सेटिंग है, लेकिन मुझे यह नहीं मिल रहा है ...

3
html.setContent(htmlBody, "text/html"); 
html.setHeader("MIME-Version" , "1.0"); 
html.setHeader("Content-Type" , html.getContentType()); 

setContent और setHeader("Content-Type", String) एक ही बात करते हैं - यह है कि html.getContentType()text/html के अलावा कुछ लौटा रहा है हो सकता है?

, टिप्पणी और @PhilLho & @ एरिक्सन के जवाब (Geez, मैं धीरे धीरे टाइप करना होगा) के आधार पर विस्तार हो रहा उपयोग करें:

MimeMultipart content = new MimeMultipart("alternative") 
+0

यह वास्तव में एक मुद्दा है। यह "पाठ/सादा" लौट रहा है। इसलिए मैंने समायोजन किया है लेकिन मुझे अभी भी एक ही समस्या मिल रही है ... अच्छी पकड़! –

1

आप प्राप्त संदेश के स्रोत पर गौर करना चाहिए: की सामग्री प्रकार है संदेश multipart/वैकल्पिक?

5

के रूप में पहले से ही सुझाव है html.setHeader("Content-Type", html.getContentType()) कॉल को दूर करने के अलावा, मैं लाइन की जगह चाहते हैं:

MimeMultipart content = new MimeMultipart(); 

है & hellip; साथ:

MimeMultipart content = new MimeMultiPart("alternative"); 

है & hellip; और लाइन को हटाने:

message.setHeader("Content-Type" , content.getContentType()); 

डिफ़ॉल्ट MimeMultiPart कन्स्ट्रक्टर causi हो सकता है एक "मल्टीपार्ट/मिश्रित" सामग्री-प्रकार के साथ समस्याएं।

मल्टीपार्ट/वैकल्पिक का उपयोग करते समय, विकल्पों को आदेश दिया जाता है कि वे मूल रूप से सर्वोत्तम प्रतिपादन के साथ मूल के प्रति कितने वफादार हैं। हालांकि, क्लाइंट आम तौर पर एचटीएमएल मौजूद होने पर भी सादा पाठ प्रदर्शित करने का विकल्प देते हैं। क्या आप वाकई Outlook में यह विकल्प सक्षम नहीं हैं? अन्य उपयोगकर्ता एजेंट, जैसे थंडरबर्ड, या जीमेल, आपके संदेशों का इलाज कैसे करते हैं?

इसके अलावा, सुनिश्चित करें कि HTML अच्छी तरह से गठित है। मैं W3 validation service के साथ HTML सामग्री को मान्य करता हूं, और संभवतः इसे फ़ाइल में सहेजता हूं और इसे IE के विभिन्न संस्करणों के साथ भी देखता हूं। शायद वहां एक दोष है जिससे आउटलुक सादा पाठ में वापस आ सकता है।

+0

मैंने भी भाग्य के साथ कोशिश की है। मैंने अन्य तरीकों की भी कोशिश की, भले ही मुझे पता था कि वे काम नहीं करेंगे (मिश्रित, आदि)। आउटलुक के लिए, यह अभी भी केवल टेक्स्ट संस्करण प्रदर्शित करना चाहता है, कभी भी एचटीएमएल बॉडी नहीं। और जीमेल एचटीएमएल प्रदर्शित करता है, लेकिन HTML के रूप में एचटीएमएल, एचटीएमएल प्रस्तुत पृष्ठ के रूप में नहीं। अजीब... –

0

workaroung समाधान हल दृष्टिकोण 2003: यह संदेश एक ऐसे चरित्र सेट का उपयोग करता है जो इंटरनेट सेवा द्वारा समर्थित नहीं है। सही ढंग से प्रदर्शित नहीं करता है।

यह एन्कोडिंग के कारण हो सकता है। सबसे HTML पृष्ठों, का उपयोग iso-8859-1 नहीं cp-1252

उदाहरण के लिए परिवर्तित करने का प्रयास अपने कोड है:

message.setContent(sBuffer.toString(), "text/html"); 

बदलें इस के लिए:

message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\""); 

यह एक नई जाँच अपवाद फेंकता : java.io.UnsupportedEncodingException ताकि आपको इसे फेंकने या पकड़ने के लिए घोषित करने की आवश्यकता हो। आईएसओ -885 9 -1 का समर्थन किया जाता है, इसलिए अपवाद कभी नहीं फेंक दिया जाएगा जब तक कि आपके rt.jar से कुछ दूषित न हो जाए।

सादर, जावेद [email protected]

3

बदलें इस के लिए:

message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\""); 

सामग्री चार सेट तय करने की आवश्यकता है, मैं नहीं दिख रहा है यही कारण है कि सामग्री ही। नहीं बल्कि ऐसा होना चाहिए:

message.setContent(sBuffer.toString(), "text/html;charset=iso-8859-1"); 
1
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1"); 

आपकी समस्या (\" वर्ण निकाला गया) का समाधान करना चाहिए।

mimeBodyPart1.setDataHandler(new DataHandler(new ByteArrayDataSource(messageBody, "text/html; charset=utf-8"))); 
multiPart.addBodyPart(mimeBodyPart1); 
message.setContent(multiPart, "text/html; charset=utf-8"); 

अब, आउटलुकएचटीएमएल प्रारूप में प्रदर्शित करता है:

2

मैं निम्नलिखित कोड का इस्तेमाल किया।