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

请帮助我了解如何更正此“错误”。


答案 1

对于所有电子邮件

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

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

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

对于特定电子邮件

但是,如果要为特定电子邮件指定特定编码,则可能应使用 2 参数和方法。setSubject(subject,charset)setText(text,charset)

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

哑剧类型很复杂

(正如其他消息来源所声称的)将不起作用。只需查看此方法的签名:。哑剧类型和字符集是两个完全不同的东西。恕我直言,您真的应该使用带有字符集参数的方法之一。setContent(content, "UTF-8")setContent(Object content, String mimetype)setText(...)

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

  • RFC-2046 中所指定,的默认字符集为 ,但可以使用其他字符集参数进行覆盖。text/plainUS-ASCII
  • 但是,在 RFC-6657 中,明确类型使用消息内容确定字符集。此处将忽略字符集参数。text/xml
  • RFC-2854中指出,应该始终指定一个字符集。但是如果你不这样做,那么它将使用(=)。text/htmlISO-8859-1Latin-1

答案 2

也许你应该在这里也提供UTF-8

mimeMessage.setContent(message, "text/plain; charset=UTF-8");

你必须看看 http://www.coderanch.com/t/274480/java/java/JavaMail-set-content-utf


推荐