Как отправить 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?
Ответы
Ответ 1
После большого количества исследований я смог добиться значительного прогресса.
Во-первых, вместо использования 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, но я не могу его найти...
Ответ 2
В дополнение к удалению 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".
При использовании multipart/alternative альтернативы упорядочиваются по тому, насколько они верны оригиналу, с последним последним. Однако клиенты обычно предоставляют пользователям возможность отображать простой текст, даже если присутствует HTML. Вы уверены, что этот параметр не включен в Outlook? Как другие ваши агенты, такие как Thunderbird или GMail, обрабатывают ваши сообщения?
Кроме того, убедитесь, что HTML хорошо сформирован. Я проверил бы содержимое HTML с помощью службы проверки W3 и, возможно, сохранил его в файле и просмотрел его в разных версиях IE. Может быть, есть недостаток, в результате чего 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 и @erickson answer (geez, я должен печатать медленно), используйте:
MimeMultipart content = new MimeMultipart("alternative")
Ответ 4
Измените это:
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\"");
Необходимо установить набор char, я не понимаю, почему сам контент.
Должно быть:
message.setContent(sBuffer.toString(), "text/html;charset=iso-8859-1");
Ответ 5
Я использовал следующий код:
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.
Ответ 6
Вы должны посмотреть на источник полученного сообщения: есть ли Content-Type сообщения multipart/alternative?
Ответ 7
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1");
Должна решить вашу проблему (удалены \"
символы).
Ответ 8
workaroung solution solve 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]