Проблема с кодировкой темы при отправке сообщения электронной почты
Я отправляю электронное письмо, и я получаю его правильно, но кодировка объекта неверна. Я посылаю "invitación", но я получаю "invitaci? N". Содержание сообщения в порядке.
Содержимое сообщения происходит от преобразования шаблона Velocity, когда объект задан в переменной String.
Я googled вокруг, и я видел, что некоторые люди говорят, что MimeUtility.encodeText() может решить проблему, но я не имел успеха с ней.
Как я могу решить проблему? Это код, который у меня есть.
String subject = "Invitación";
String msgBody = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/vmTemplates/template.vm", "UTF-8", model);
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
try {
String encodingOptions = "text/html; charset=UTF-8";
Message msg = new MimeMessage(session);
msg.setHeader("Content-Type", encodingOptions);
msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
msg.setSubject(subject);
msg.setContent(msgBody, encodingOptions);
Transport.send(msg);
} catch (AddressException e) {
...
} catch (MessagingException e) {
...
}
Спасибо
Ответы
Ответ 1
JavaMail, возможно, слишком много абстракции, и вы становитесь жертвой этого здесь. Когда вы используете
Message msg = new MimeMessage(session);
вы создаете объект MimeMessage
, но рассматриваете его как объект Message
. Message
имеет только метод setSubject(String subject)
, который использует кодировку платформы по умолчанию для кодирования объекта. Если платформа по умолчанию не может закодировать ее, вы получаете символы ?
в полученном заголовке. MimeMessage
, однако, имеет метод setSubject(String subject, String charset)
, который позволит вам указать кодировку, которую вы хотите использовать для кодирования объекта. Поэтому просто переключите свой код на
MimeMessage msg = new MimeMessage(session);
msg.setHeader("Content-Type", encodingOptions);
msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
msg.setSubject(subject, "UTF-8");
и он должен работать.
Ответ 2
вы можете использовать, он работает
msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));
Ответ 3
Возможно, вы можете попробовать: msg.setSubject(subject, "UTF8");
Ответ 4
В моем случае единственное, что сработало, - это изменение языкового стандарта системы на тот, который поддерживает нужный набор символов.
До этого я пробовал много разных способов, включая принятый ответ из этого потока, но ни один из них не помог.