UTF-8 字符集不适用于 javax.mail

新手上路,请多包涵

我使用 Java Mail API 来发送电子邮件。我正在使用联系人公式发送输入,必须将其发送到特定的电子邮件。

电子邮件发送没有问题,虽然我是丹麦人,因此我需要在主题和电子邮件文本中使用三个丹麦字符,即“æ”、“ø”和“å”。

因此,我看到我可以使用 UTF-8 字符编码来提供这些字符,但是当我发送邮件时,我只看到一些奇怪的字母 - ‘㦒、’㸒 和 ‘㥒 - 而不是丹麦字母 - ‘æ’、’ø’ 和 ‘å’。

我发送电子邮件的方法如下所示:

 public void sendEmail(String name, String fromEmail, String subject, String message) throws AddressException, MessagingException, UnsupportedEncodingException, SendFailedException
{
    //Set Mail properties
    Properties props = System.getProperties();
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty("mail.smtp.host", "smtp.gmail.com");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.port", "465");
    Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("my_username", "my_password");
        }
    });

    //Create the email with variable input
    MimeMessage mimeMessage = new MimeMessage(session);
    mimeMessage.setHeader("Content-Type", "text/plain; charset=UTF-8");
    mimeMessage.setFrom(new InternetAddress(fromEmail, name));
    mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("my_email"));
    mimeMessage.setSubject(subject, "utf-8");
    mimeMessage.setContent(message, "text/plain");

    //Send the email
    Transport.send(mimeMessage);
}

请帮我找出如何纠正这个“错误”。

原文由 Rohwedder 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 790
2 个回答

对于所有电子邮件

有几个 与 mailing 相关的系统属性,它们可能会简化您的代码。我实际上是在谈论这个特定的属性: "mail.mime.charset"

mail.mime.charset 系统属性可用于 指定默认 MIME 字符集,以用于未指定字符集的编码单词和文本部分。通常,默认 MIME 字符集派生自默认 Java 字符集,如 file.encoding 系统属性中所指定。大多数应用程序不需要显式设置默认 MIME 字符集。如果用于邮件消息的默认 MIME 字符集与用于存储在系统上的文件的字符集不同,则应设置此属性。

正如您在上面看到的,默认情况下 mail.mime.charset 没有值,并且使用文件编码( file.encoding 属性)。

对于特定的电子邮件

但是,如果您想为特定电子邮件指定特定编码,那么您可能应该使用 2 个参数 setSubject(subject,charset)setText(text,charset) 方法。

如果这不起作用,那么您的输入可能在达到这一点之前已经损坏。换句话说,您可能使用了错误的编码来收集数据

MIME 类型很复杂

setContent(content, "UTF-8") (正如其他来源所声称的那样)将无法正常工作。看看这个方法的签名: setContent(Object content, String mimetype)Mime 类型和字符集是两种完全不同的东西。 恕我直言,您真的应该使用带有字符集参数的 setText(...) 方法之一。

但是,如果您坚持使用 mimetype 来设置字符集 setContent(content,mimetype) ,那么请使用正确的格式。 (不仅仅是 "UTF-8" ,而是类似 "text/plain; charset=UTF-8" 的东西)。但更重要的 是,请注意每种 MIME 类型都有自己处理字符集的方式。

  • 正如 RFC-2046 中指定的, text/plain 的默认字符集是 US-ASCII ,但可以用额外的字符集参数来否决。
  • 但是,在 RFC-6657 中明确指出 text/xml 类型使用消息内容确定字符集。 字符集参数将在这里被忽略。
  • RFC-2854 中声明 text/html 应该总是指定一个字符集。但如果你不这样做,那么它将使用 ISO-8859-1 (= Latin-1 )。

原文由 bvdb 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题