Как отправить HTML-письмо в Outlook с Java

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

Я обновил свой ответ новой идеей.

erickson 27.11.2008 19:55

@erickson: я поддержал ваш ответ;)

Stephane Grenier 18.05.2010 19:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
2
44 521
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Это действительно одна проблема. Он возвращает «текст / обычный». Итак, я внес изменения, но у меня все еще та же проблема ... Хороший улов!

Stephane Grenier 27.11.2008 01:08

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

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

MimeMultipart content = new MimeMultipart();

…с:

MimeMultipart content = new MimeMultiPart("alternative");

… И удалив строку:

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

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

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

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

Я тоже пробовал, но безуспешно. Я также пробовал другие режимы, хотя знал, что они не будут работать (смешанные и т. д.). Для Outlook он по-прежнему хочет отображать только текстовую версию, а не тело HTML. И gmail отображает html, но html как текст, а не как отображаемую страницу html. Странный...

Stephane Grenier 27.11.2008 19:32
Ответ принят как подходящий

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

Во-первых, вместо прямого использования JavaMail я рекомендую использовать библиотеку Электронная почта Jakarta Commons. Это действительно сильно упрощает задачу!

Код теперь:

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, но я не могу ее найти ...

временное решение решено 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 [email protected]

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

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

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

Другие вопросы по теме