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.