utf 8 charset不适用于javax邮件

Roh*_*der 45 java jakarta-mail utf-8 character-encoding

我使用Javax 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);
}
Run Code Online (Sandbox Code Playgroud)

请帮我看看如何纠正这个'错误'.

bvd*_*vdb 73

对于所有电子邮件

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

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

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

对于特定的电子邮件

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

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

哑剧类型很复杂

setContent(content, "UTF-8")(其他消息来源)将只是不工作.看看这种方法的签名:setContent(Object content, String mimetype).Mime类型和charset是两个完全不同的东西.Imho,你应该使用setText(...)charset参数中的一个方法.

但是如果你坚持使用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).

  • 非常好的解释。当我遇到这个问题时,我改变了这一点:message.setContent(body, "text/html"); 对此:message.setContent(body, "text/html;charset=utf-8"); (3认同)

Ars*_*yan 35

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

mimeMessage.setContent(message, "text/plain; charset=UTF-8");
Run Code Online (Sandbox Code Playgroud)

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

  • 抱歉,我已经从您的链接(包括您自己的“解决方案”)中尝试了很多方法,但似乎不起作用:( (2认同)

Roh*_*der 7

花了很多时间进行调试,并在网上搜索线索后,我找到了解决问题的方法.

似乎每当我通过Web请求发送数据时,我的应用程序都没有使用UTF-8编码对字符进行编码.这意味着从我的联系表单发送的包含æ,ø和å字符的数据无法通过字符编码正确处理.

该解决方案似乎在我的部署描述符中设置了一个字符编码过滤器,它将来自Web的所有传入请求编码为UTF-8字符编码.

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, "/*");
}
Run Code Online (Sandbox Code Playgroud)

此过滤器将编码设置为UTF-8,并强制编码到url'/*'的所有请求.