我用的javax邮件API,用于发送电子邮件。 我使用的是接触公式推派的投入,这必须被发送到特定的电子邮件。
该电子邮件发送没有问题,但我是一个丹麦人,因此需要三个丹麦字符,这是“æ”,“O”和“A”,在主题和电子邮件的文本我。
因此,我已经看到了,我可以使用UTF-8字符编码,提供这些人物,但是当我的邮件发送我只看到一些奇怪的字母 - “ã|”,“A”和“A¥” - 而不是丹麦字母 - “æ”,“O”和“a”。
我的方法发送电子邮件看起来像这样
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);
}
请帮我找出我怎么能解决这个“错误”。
对于所有的电子邮件
有一对夫妇的有关邮件系统性能 ,这可能可以简化你的代码。 我讲的这个特定的属性实际上: "mail.mime.charset"
。
该mail.mime.charset
系统属性可以用来指定默认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类型和字符集是完全2个不同的东西。 恕我直言,你应该使用的一个setText(...)
用charset参数的方法。
但是,如果你在使用MIME类型来设置字符集坚持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
)。
也许你也应该提供UTF-8在这里
mimeMessage.setContent(message, "text/plain; charset=UTF-8");
你要看看http://www.coderanch.com/t/274480/java/java/JavaMail-set-content-utf
花在调试了很多时间,和搜索线索上网后,我已经找到了解决我的问题。
似乎每当我通过web请求sended数据,我的应用程序没有编码与UTF-8编码的字符。 这意味着,这是从我接触的形式,其中载æ发送数据,O和a字符,不能由字符编码处理是正确的。
该解决方案似乎设置字符编码过滤器 ,在我的部署描述符,这将编码来自网站的所有传入的请求以与字符编码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, "/*");
}
该过滤器设置编码为UTF-8,并迫使编码在URL“/ *”所有正在添加请求。
这很容易,用参数运行项目-Dfile.ecoding = UTF-8! 例如:java的-Dfile.encoding = UTF-8 -jar MyProject.jar