当前位置: 首页 > 面试题库 >

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

壤驷兴朝
2023-03-14
问题内容

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

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


问题答案:

对于所有电子邮件

有两个与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)。


 类似资料:
  • 我正在Ubuntu中运行httpd+mod_jk+2个tomcat服务器。当我以非拉丁语言提交表单时,我会在DB中得到垃圾。如果我通过Tomcat提交相同的表单,直接绕过httpd,那么一切看起来都很好。以下是我的配置: /ETC/APACHE2/CONF.D/CHARSET: Tomcat1: Tomcat2: JDBC连接: jdbc:mysql://localhost:3306/myapp?

  • 问题内容: 我们将对使用JSF2.0,Hibernate,MySQL设计的Web应用程序启用UTF-8字符编码。 以下是我们的应用程序上下文文件中定义的数据源 在运行应用程序时,我们遇到异常 我们也尝试使用以下方法,但出现错误 问题答案: 经过一些解决后,我能够处理该问题-以下是对我有用的代码,以启用与UTF8一起使用的JDBC 配合使用达到目的 为了能够与Hibernate一起使用,还应在hib

  • 问题内容: 我已经阅读了一段时间的Unicode和UTF-8编码,并且我想我理解了,所以希望这不会是一个愚蠢的问题: 我有一个文件,其中包含一些CJK字符,并且已另存为UTF-8。我安装了各种亚洲语言包,并且其他应用程序可以正确显示这些字符,因此我知道可以做很多工作。 在我的Java应用程序中,我读取文件的方式如下: 输出将CJK字符显示为’???’。进行呼叫以确认它肯定是在使用UTF-8。我缺少

  • 问题内容: 如何使用Android解码utf-8字符串?我尝试使用此命令,但输出与输入相同: 问题答案: 字符串不需要编码。它只是一个Unicode字符序列。 要将字符串转换为字节序列时需要进行 编码 。您选择的字符集(UTF-8,cp1255等)确定了Character-> Byte映射。请注意,字符不必转换为单个字节。在大多数字符集中,大多数Unicode字符都转换为至少两个字节。 字符串的编

  • 问题内容: 我正在从外部服务器加载HTML。HTML标记具有UTF-8编码,并包含ľ,š,č,ť,ž等字符。当我使用file_get_contents()加载HTML时,如下所示: 它弄乱了UTF-8字符并加载了Å,¾,¤和类似的废话,而不是正确的UTF-8字符。 我该如何解决? 更新: 我尝试将HTML保存到文件中并以UTF-8编码输出。两者都不起作用,所以这意味着file_get_conten

  • 问题内容: 因此,我有一个字符串数组,所有字符串都使用系统默认的 ANSI 编码,并从SQL数据库中提取。因此,存在256个不同的可能字符字节值(单字节编码)。 有没有一种方法可以使我工作并显示这些字符,而不必在我的所有字符串上使用并最终得到类似的东西? 还是这是JSON的标准? 问题答案: 有没有一种方法可以使json_encode()工作并显示这些字符,而不必在所有字符串上都使用utf8_en