小编典典

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

java

我已经使用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);
}

请帮助我找出如何纠正此“错误”。


阅读 372

收藏
2020-09-15

共1个答案

小编典典

对于所有电子邮件

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

mail.mime.charset 系统属性可以用来 指定默认MIME字符集
用于编码的单词和文本部分不另行指定一个字符集。通常,默认的MIME字符集是从file.encodingSystem属性中指定的默认Java字符集派生的。大多数应用程序无需显式设置默认的MIME字符集。如果用于邮件的默认MIME字符集与用于存储在系统上的文件的字符集不同,则应设置此属性。

如上文所述,默认情况下没有的值,mail.mime.charset并且使用文件编码(file.encoding属性)。

对于特定的电子邮件

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

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

哑剧类型很复杂

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

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

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