Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发送电子邮件时主题编码有问题_Java_Google App Engine_Encoding_Jakarta Mail_Velocity - Fatal编程技术网

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

Java 发送电子邮件时主题编码有问题,java,google-app-engine,encoding,jakarta-mail,velocity,Java,Google App Engine,Encoding,Jakarta Mail,Velocity,我正在发送一封电子邮件,并且收到的邮件是正确的,但是主题的编码不正确。我发送的是“因维塔西翁”,但我收到的是“因维塔西翁”。消息内容正常 消息的内容来自Velocity模板的转换,而主题在字符串变量中设置 我在谷歌上搜索过,看到有人说MimeUtility.encodeText()可以解决这个问题,但我没有成功 我怎样才能解决这个问题?这是我目前掌握的代码 String subject = "Invitación"; String msgBody = VelocityEngineUtils.me

我正在发送一封电子邮件,并且收到的邮件是正确的,但是主题的编码不正确。我发送的是“因维塔西翁”,但我收到的是“因维塔西翁”。消息内容正常

消息的内容来自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) {
        ...
    } 

谢谢

也许你可以试试:
msg.setSubject(subject,“UTF8”)

JavaMail可能有点太多的抽象,而您正成为它的牺牲品。当你使用

Message msg = new MimeMessage(session);
您正在创建一个
MimeMessage
对象,但将其视为
消息
对象
Message
只有一个
setSubject(stringsubject)
方法,该方法使用平台默认字符集对主题进行编码。如果平台默认值无法对其进行编码,则会在结果标头中获得
字符<但是,code>mimessage
有一个
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"));

在我的例子中,唯一有效的方法是将系统区域设置更改为支持所需字符集的区域设置。
在此之前,我尝试了许多不同的方法,包括来自此线程的已接受答案,但没有一种有效。

javax.mail.Message没有此方法。我正在使用AppEngine提供的Java邮件API。哦,对不起!我没注意到这和AppEngine有关!起初我忘了。我后来编辑了这篇文章,将其标记为AppEngine。无论如何,谢谢。
Message
的唯一子类是
MimeMessage
。我怀疑是否有人实现了另一个子类。如果JavaMail刚刚崩溃
javax.mail
javax.mail.internet
,那么JavaMail就不会那么糟糕了——额外的抽象层只是意味着你一直在向子类施压。这并没有解决我的问题(在主题行中发送£符号)@Mark:你尝试了
msg.setSubject(“\u00a3”,“UTF-8”)
而且它没有正确编码主题?生成的主题标题中有什么?抱歉。我修复了我的问题,与子项编码无关-它与读取用于填充主题的文件有关,因此在添加到消息之前,我的主题字符串不正确。@dkarp:我一直认为拼写是“Groddy”。。。我被纠正了:)