Проблема с темой кодировки при отправке электронного письма - PullRequest
27 голосов
/ 04 февраля 2011

Я отправляю сообщение по электронной почте и получаю его правильно, но кодировка темы неверна.Я отправляю "invitación", но я получаю "invitaci? N".Содержание сообщения в порядке.

Содержание сообщения исходит от преобразования шаблона скорости, в то время как тема установлена ​​в строковой переменной.

Я гуглил и видел, что некоторые люди говорятчто 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) {
        ...
    } 

Спасибо

Ответы [ 4 ]

43 голосов
/ 04 февраля 2011

В 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");

и он должен работать.

7 голосов
/ 19 октября 2013

можно использовать, все работает

msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));
4 голосов
/ 04 февраля 2011

Может быть, вы можете попробовать: msg.setSubject(subject, "UTF8");

0 голосов
/ 02 декабря 2016

В моем случае единственное, что сработало, - это изменение языкового стандарта системы на тот, который поддерживает желаемый набор символов. До этого я пробовал много разных способов, включая принятый ответ из этой ветки, но ни один из них не помог.

...