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

Jav*_*avi 28 java google-app-engine encoding velocity jakarta-mail

我正在发送一封电子邮件,但我正确地收到了该邮件,但该主题的编码不正确.我发送"invitación"但我收到"invitaci?n".消息内容正常.

当主题在String变量中设置时,消息的内容来自Velocity Template的转换.

我已经google了,我看到有人说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) {
        ...
    } 
Run Code Online (Sandbox Code Playgroud)

谢谢

dka*_*arp 43

JavaMail可能有点抽象,你在这里成为受害者.当你使用

Message msg = new MimeMessage(session);
Run Code Online (Sandbox Code Playgroud)

你正在创建一个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");
Run Code Online (Sandbox Code Playgroud)

它应该工作.


Edy*_*rre 7

你可以使用,它的工作原理

msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));
Run Code Online (Sandbox Code Playgroud)