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.encoding
System属性中指定的那样.大多数应用程序不需要显式设置默认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类型都有自己的处理字符集的方式.
text/plain
是US-ASCII
,但可以使用其他字符集参数进行否决.text/xml
类型使用消息内容来确定字符集.这里只会忽略charset参数.text/html
应该总是指定一个字符集.但如果你不这样做,那么它将使用ISO-8859-1
(= Latin-1
).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
花了很多时间进行调试,并在网上搜索线索后,我找到了解决问题的方法.
似乎每当我通过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'/*'的所有请求.