Подтвердить что ты не робот

Проблема с кодировкой темы при отправке сообщения электронной почты

Я отправляю электронное письмо, и я получаю его правильно, но кодировка объекта неверна. Я посылаю "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) {
        ...
    } 

Спасибо

4b9b3361

Ответ 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

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