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

vfwfrxfs  于 2021-10-10  发布在  Java
关注(0)|答案(6)|浏览(325)

我使用java邮件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);
}

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

gudnpqoy

gudnpqoy1#

对于所有电子邮件

有两个与邮件相关的系统属性,它们可能会简化您的代码。实际上,我指的是这个特定的属性: "mail.mime.charset" .
这个 mail.mime.charset system属性可用于指定默认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/plainUS-ASCII ,但可以使用附加的字符集参数来推翻。
然而,在rfc-6657中明确指出 text/xml 类型使用消息的内容确定字符集。这里将忽略charset参数。
rfc-2854中规定: text/html 应该始终指定一个字符集。但如果你不这样做,那么它将使用 ISO-8859-1 (= Latin-1 ).

xwmevbvl

xwmevbvl2#

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

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

你得看看http://www.coderanch.com/t/274480/java/java/javamail-set-content-utf

pepwfjgg

pepwfjgg3#

在花了大量时间进行调试并在互联网上搜索线索后,我找到了解决问题的方法。
似乎每当我通过web请求发送数据时,我的应用程序都没有使用utf-8编码对字符进行编码。这意味着从我的联系人表单发送的数据(包含æ、ø和å字符)无法通过字符编码正确处理。
该解决方案似乎在我的部署描述符中设置了一个字符编码过滤器,它将使用字符编码utf-8对来自web的所有传入请求进行编码。

private void registerCharacterEncodingFilter(ServletContext servletContext) {
    CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    encodingFilter.setEncoding("UTF-8");
    encodingFilter.setForceEncoding(true);
    FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter);
    characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
}

此筛选器将编码设置为utf-8,并强制对url“/*”处提交的所有请求进行编码。

mgdq6dx1

mgdq6dx14#

使用参数-dfile.encoding=utf-8 ex:java-dfile.encoding=utf-8-jarmyproject.jar运行项目很简单
//排错

e5nszbig

e5nszbig5#

我知道这个问题我来晚了,但我刚才也遇到了类似的问题。
检查你的源代码也是值得的!我使用的是一个测试类,硬编码的主题/文本包含一些特殊字符,在发送电子邮件时,这些字符不断出现混乱。即使我已经在适当的地方设置了字符集utf-8(mimessage.setsubject(subject,charset),mimessage.setcontent(content,text/plain;字符集=utf-8“)。
然后我注意到这个类的源代码是windows-1252。据我所知,当编译java文件时,任何源文本都会转换为utf-8。但是在本例中,在这个项目的maven pom.xml中,缺少project.build.sourceencoding属性-因此我实际上不确定编译期间(默认情况下)使用的是哪种编码maven,因为没有指定任何编码。
在这里不可能更改源代码编码,但当我将特殊字符更改为unicode代码文字(例如,“ü”更改为“\u00fc”)时,整个过程都很顺利。

l7wslrjt

l7wslrjt6#

在将字符串发送到send方法之前,必须将字符串转换为utf-8
如果您正在接收“请求”参数,则可以使用“setcharacterencoding”:

request.setCharacterEncoding("utf-8");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
...
MimeMessage mineMessage = new MimeMessage(session);
        mineMessage.setFrom(new InternetAddress(myAccountEmail));
        mineMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
        mineMessage.setSubject(subject, "UTF-8");
        mineMessage.setContent(content, "text/plain;charset=UTF-8");

否则,请使用以下方法将字符串转换为utf-8格式:

String subject = new String(subject.getBytes(Charset.forName("ISO-8859-1")), Charset.forName("UTF-8"));
String content = new String(content.getBytes(Charset.forName("ISO-8859-1")), Charset.forName("UTF-8"));
...
MimeMessage mineMessage = new MimeMessage(session);
    mineMessage.setFrom(new InternetAddress(myAccountEmail));
    mineMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
    mineMessage.setSubject(subject, "UTF-8");
    mineMessage.setContent(content, "plain/plain;charset=UTF-8");

这是西班牙语的结果。

相关问题