2008-11-26 5 views
18

Я пытаюсь отправить электронное письмо в формате html с помощью JavaMail, но оно всегда отображается только как текстовое письмо в Outlook.Как отправить html-письмо в Outlook с Java

Вот мой код:

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 2008-11-27 16:55:40

+0

@erickson: upvote на ваш ответ от меня;) – 2010-05-18 15:06:28

ответ

16

После большого расследования я смог добиться значительного прогресса.

Во-первых, вместо использования JavaMail я рекомендую использовать библиотеку 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(); 

Разговор о простой.

Однако все еще есть проблема. Версия html электронной почты отлично работает в Gmail, Hotmail и т. Д. Но она по-прежнему не отображается правильно в 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 & @ ответ Эриксона (геэз, я должен набирать медленно), используйте:

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

Это действительно одна проблема. Он возвращает «text/plain». Так что я сделал корректировку, но я все еще получаю ту же проблему ... Хорошая уловка! – 2008-11-26 22:08:55

1

Вы должны смотреть на источник принятого сообщения: это тип содержимого сообщение multipart/alternative?

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 может быть причинным ng с «многостраничным/смешанным» типом контента.

При использовании multipart/alternative альтернативы упорядочены по тому, насколько они верны оригиналу, с последним последним. Однако клиенты обычно предоставляют пользователям возможность отображать простой текст, даже если присутствует HTML. Вы уверены, что этот параметр не включен в Outlook? Как другие ваши агенты, такие как Thunderbird или GMail, обрабатывают ваши сообщения?

Также убедитесь, что HTML хорошо сформирован. Я бы проверил содержимое HTML с помощью W3 validation service и, возможно, сохранил его в файле и просмотрел его в разных версиях IE. Возможно, есть недостаток, в результате чего Outlook возвращается к простому тексту.

0

workaroung solution resolved outlook 2003: Это сообщение использует набор символов, который не поддерживается службой Интернета. не отображается правильно.

Возможно, это связано с кодировкой. Большинство HTML-страницы с помощью ISO-8859-1 не ср-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, поэтому вам нужно объявить, что он будет выброшен или поймать его. iso-8859-1 поддерживается так, исключение никогда не будет выброшено, если что-то не будет повреждено вашим rt.jar.

С уважением, Javeed [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"); 

Если решить вашу проблему (удалить \" символов).

2

Я использовал следующий код:

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

Теперь Перспективы отображается в формате HTML.

Смежные вопросы