Проблема с кодировкой темы при отправке письма

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

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

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


у JavaMail, возможно, слишком много абстракции, и вы становитесь жертвой этого здесь. Когда вы используете

Message msg = new MimeMessage(session);

ты создания a 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");

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


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

msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));

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


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