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

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

谢谢

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

它应该工作。

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

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

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

在我的情况下,唯一有效的是将系统区域设置更改为支持所需字符集的区域设置。 在此之前,我尝试了许多不同的方式,包括来自这个主题的接受的答案,但没有一个帮助。