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

2023-12-20

我正在发送一封电子邮件,并且可以正确接收它,但主题的编码不正确。我正在发送“invitación”,但收到“invitaci?n”。消息内容没问题。

消息的内容来自 Velocity 模板的转换,而主题设置在字符串变量中。

我用谷歌搜索了一下,发现有人说 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) {
        ...
    } 

Thanks


JavaMail 可能有太多的抽象,而您在这里就成为了它的受害者。当你使用

Message msg = new MimeMessage(session);

you're creating 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");

它应该有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

发送电子邮件时主题编码问题 的相关文章

随机推荐