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)
它应该工作.
你可以使用,它的工作原理
msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));
Run Code Online (Sandbox Code Playgroud)