Как отправить HTML письмо в Outlook с Java - PullRequest
18 голосов
/ 27 ноября 2008

Я пытаюсь отправить электронное письмо в формате html, используя JavaMail, но в 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?

Ответы [ 8 ]

16 голосов
/ 27 ноября 2008

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

Во-первых, вместо прямого использования 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, но я не могу ее найти ...

5 голосов
/ 27 ноября 2008

В дополнение к удалению html.setHeader("Content-Type", html.getContentType()) звоните как подсказывают уже, я бы заменил строку:

MimeMultipart content = new MimeMultipart();

& hellip; с:

MimeMultipart content = new MimeMultiPart("alternative");

& hellip; и удаление строки:

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

Конструктор MimeMultiPart по умолчанию может вызывать проблемы с типом содержимого «multipart / mixed».

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

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

3 голосов
/ 20 сентября 2012

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

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

Теперь Outlook отображается в формате html .

3 голосов
/ 12 января 2010

Измените это на:

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");
3 голосов
/ 27 ноября 2008
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 & @ erickson (боже, я должен печатать медленно), используйте:

MimeMultipart content = new MimeMultipart("alternative")
1 голос
/ 14 сентября 2010
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1");

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

1 голос
/ 27 ноября 2008

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

0 голосов
/ 10 марта 2009

workaroung решение решено outlook 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, поэтому вам нужно объявить его как выброшенный или перехватить его. Поддерживается iso-8859-1, поэтому исключение никогда не будет выдано, если что-то не будет повреждено вашим rt.jar.

С уважением, Javeed javeed.mca@gmail.com

...