Javamail меняет кодировку строки темы

Я использую Javamail (javax.mail) для отправки писем. Я успешно скорректировал содержимое моей почты как utf-8. Однако я не мог задать строку темы как строку с кодировкой utf-8.

Я пробовал даже

mail.setSubject(new String(subject.getBytes("utf-8"), "utf-8"));

но он по-прежнему отправляется как Cp1252. Примеры заголовков из почты приведены ниже:

Любые идеи?

пример из заголовков сообщений http://m.friendfeed-media.com/a328a80db12f3c17a8aed06be106045354355abf

Ответ 1

Вы должны использовать setSubject (String subject, String charset), что является удобной функцией для этой цели.

Session session=Session.getDefaultInstance(new Properties());
MimeMessage mimeMsg= new MimeMessage(session);
String subject="Herr Müller reist nach \u0141\u00f3d\u017a.";
mimeMsg.setSubject(subject,"utf-8");
System.out.println(subject);
System.out.println(mimeMsg.getHeader("Subject")[0]);

В MimeUtility говорится:

Существует множество способов кодирования и декодирования заголовков MIME в соответствии с RFC 2047. Обратите внимание, что в целом эти методы не нужны при использовании таких методов, как setSubject и setRecipients; JavaMail будет автоматически кодировать и декодировать данные при использовании этих методов "более высокого уровня". Методы, приведенные ниже, необходимы только при maniuplating исходных заголовках MIME с использованием методов setHeader и getHeader.

С моей точки зрения, Message.setSubject должна быть точкой входа для этой цели.

Появится cp1252 в вашей теме, потому что это ваша стандартная кодировка на вашей платформе.

Ваш опубликованный пример - это "результат"

mail.setSubject(MimeUtility.encodeText(subject, "cp1252", "Q"));`

Ответ 2

решаемые.

mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B"));

решает его и отправляет объекты, закодированные в utf-8.\П/

юридическими значениями для "кодирования" являются "Q" и "B"... Кодировка "Q" рекомендуется для использования, когда большинство символов, подлежащих кодированию, находятся в набор символов ASCII; в противном случае следует использовать кодировку "B".

См. http://tools.ietf.org/html/rfc2047.

Ответ 3

Проблема решена!

mail.setSubject(MimeUtility.encodeText(subject, "utf-8", "B"));

решает его и отправляет объекты, закодированные в utf-8.

Почему существует "B", почему нет ISO-что-то?

Ответ 4

У меня возникла аналогичная проблема с Apache Camel Mail, в которой используется Java Mail. Настройка

exchange.setProperty(Exchange.CHARSET_NAME, "UTF-8");

перед маршрутизацией на SMTP, решила проблему.

Ответ 5

Метод MimeMessage.setSubject(String subject, String charset) решит проблему: mimeMsg.setSubject (при условии, "UTF-8");

Это обновленная ссылка. Предыдущая ссылка на документацию была отклонена Oracle после того, как Oracle купила Sun.