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

时间:2011-02-04 12:14:18

标签: java google-app-engine encoding javamail velocity

我正在发送电子邮件,但我正确地收到了该邮件,但该主题的编码不正确。我正在发送“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) {
        ...
    } 

由于

4 个答案:

答案 0 :(得分:42)

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");

它应该有用。

答案 1 :(得分:7)

你可以使用,它可以工作

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

答案 2 :(得分:4)

也许您可以尝试:msg.setSubject(subject, "UTF8");

答案 3 :(得分:0)

就我而言,唯一有效的方法是将系统区域设置更改为支持所需字符集的区域设置。 在此之前,我尝试了许多不同的方法,包括这个帖子中接受的答案,但没有一个帮助。