2008-11-26 14 views
18

Próbuję wysłać wiadomość e-mail w formacie html przy użyciu JavaMail, ale zawsze wydaje się ona wyświetlać tylko jako wiadomość tekstową w programie Outlook.Jak wysłać wiadomość e-mail w formacie HTML do programu Outlook z poziomu języka Java?

Oto mój kod:

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; 
}  

jakieś pomysły dlaczego wersja html z wiadomości e-mail nie będzie wyświetlany w programie Outlook?

+0

Zaktualizowałem moją odpowiedź z nowym pomysłem. – erickson

+0

@erickson: wiadomość o twojej odpowiedzi pochodzi ode mnie;) –

Odpowiedz

16

Po wielu badaniach udało mi się poczynić znaczne postępy.

Po pierwsze, zamiast używać JavaMail bezpośrednio, polecam korzystanie z biblioteki Jakarta Commons Email. To naprawdę bardzo upraszcza sprawę!

Kod jest teraz:

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(); 

Dyskusja o proste.

Jednak nadal występuje problem. Wersja HTML wiadomości e-mail działa świetnie w Gmailu, Hotmail itp. Jednak nadal nie będzie poprawnie wyświetlana w Outlooku. Zawsze chce wyświetlić wersję tekstową i nie jestem pewien dlaczego. Podejrzewam, że jest to ustawienie w Outlooku, ale nie mogę go znaleźć ...

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

setContent i setHeader("Content-Type", String) zrobić to samo - to jest możliwe, że html.getContentType() wraca coś innego niż text/html?

Rozszerzanie na podstawie uwag i @PhilLho & @ odpowiedź Ericksona (Rany, muszę wpisać powoli), użyj:

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

To jest rzeczywiście jeden problem. Powraca "tekst/zwykły". Tak więc dokonałem regulacji, ale wciąż mam ten sam problem ... Dobry połów! –

1

Należy spojrzeć na źródło odebranej wiadomości: Czy Content-Type z wiadomość wieloczęściowa/alternatywna?

5

Oprócz usuwania html.setHeader("Content-Type", html.getContentType()) połączenia jak już sugerują, chciałbym wymienić linię:

MimeMultipart content = new MimeMultipart(); 

& hellip; z:

MimeMultipart content = new MimeMultiPart("alternative"); 

& hellip; i usuwanie linii:

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

Domyślny konstruktor MimeMultiPart może być causi ng problemy z typem treści "wieloczęściowy/mieszany".

W przypadku korzystania z opcji wieloczęściowy/alternatywny, alternatywy są sortowane według tego, jak wierne są oryginałowi, z najlepszą wersją na końcu. Jednak klienci zwykle dają użytkownikom opcję wyświetlania zwykłego tekstu, nawet jeśli jest obecny HTML. Czy na pewno ta opcja nie jest włączona w programie Outlook? W jaki sposób inne programy użytkownika, takie jak Thunderbird czy Gmail, traktują twoje wiadomości?

Upewnij się również, że HTML jest dobrze sformułowany. Sprawdziłbym treść HTML przy pomocy W3 validation service i ewentualnie zapisałbym ją w pliku i wyświetlam również w różnych wersjach IE. Może jest tam luka, która powoduje, że program Outlook powraca do zwykłego tekstu.

+0

Próbowałem też tego bez powodzenia. Próbowałem także innych trybów, chociaż wiedziałem, że nie będą działać (mieszane itp.). W przypadku Outlooka wciąż chce wyświetlać tylko wersję tekstową, a nie treść HTML. Natomiast w Gmailu wyświetlany jest kod HTML, ale HTML jako tekst, a nie jako strona przetłumaczona w HTML. Dziwne... –

0

Rozwiązanie workaroung rozwiązane: 2003: Ta wiadomość używa zestawu znaków, który nie jest obsługiwany przez usługę internetową. nie wyświetla się poprawnie.

Może to być spowodowane kodowaniem. Większość stron html używać ISO-8859-1 nie cp-1252 spróbuj zmienić

Na przykład, kod jest:

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

Zmień to:

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

To rzuca nowe sprawdzony wyjątek : java.io.UnsupportedEncodingException, więc musisz zadeklarować, czy chcesz go rzucić, czy go złapać. iso-8859-1 jest obsługiwany, więc wyjątek nigdy nie zostanie zgłoszony, chyba że coś zostanie uszkodzone przez plik rt.jar.

Pozdrawiam, Javeed [email protected]

3

zmienić na:

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

Zawartość char zestaw musi być ustawiony, nie widzę dlaczego sama treść. powinno być raczej:

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"); 

powinno rozwiązać problem (usunięty \" znaków).

2

Użyłem poniższy kod:

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

Teraz Outlook wyświetla w formacie HTML.

Powiązane problemy