发送电子邮件时的主题编码问题

我正在发送电子邮件,并且我已正确收到该电子邮件,但主题的编码不正确。我正在发送“invitación”,但我收到的是“invitaci?n”。消息的内容正常。

消息的内容来自速度模板的转换,而主题是在 String 变量中设置的。

我用谷歌搜索过,我看到有些人说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);

您正在创建一个对象,但将其视为对象。 只有一个方法,该方法使用平台默认字符集对主题进行编码。如果平台默认值无法对其进行编码,则会在生成的标头中获取字符。,但是,有一个方法,允许您指定要用于对主题进行编码的字符集。因此,只需将代码切换到MimeMessageMessageMessagesetSubject(String subject)?MimeMessagesetSubject(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"));

推荐