Javamail меняет кодировку строки темы - PullRequest
11 голосов
/ 10 августа 2010

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

Я даже пытался

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

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

Есть идеи?

пример из заголовков почты http://m.friendfeed -media.com / a328a80db12f3c17a8aed06be106045354355abf

Ответы [ 4 ]

26 голосов
/ 10 августа 2010

Вы должны использовать 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 будет автоматически кодировать и декодировать данные при использовании этих методов «более высокого уровня». Приведенные ниже методы необходимы только при манипулировании необработанными заголовками MIME с использованием методов setHeader и getHeader.

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

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

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

mail.setSubject(MimeUtility.encodeText(subject, "cp1252", "Q"));`
23 голосов
/ 10 августа 2010

решаемая.

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

решает его и отправляет темы почты в кодировке utf-8. \ П /

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

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

2 голосов
/ 23 апреля 2012

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

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

решает и отправляет темы почты в кодировке utf-8.

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

0 голосов
/ 22 марта 2013

Я столкнулся с подобной проблемой с Apache Camel Mail, который использует Java Mail.Настройка

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

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

...