我使用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);
}
请帮助我找出如何更正此“错误”。
6条答案
按热度按时间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/plain
是US-ASCII
,但可以使用附加的字符集参数来推翻。然而,在rfc-6657中明确指出
text/xml
类型使用消息的内容确定字符集。这里将忽略charset参数。rfc-2854中规定:
text/html
应该始终指定一个字符集。但如果你不这样做,那么它将使用ISO-8859-1
(=Latin-1
).xwmevbvl2#
也许你也应该在这里提供utf-8
你得看看http://www.coderanch.com/t/274480/java/java/javamail-set-content-utf
pepwfjgg3#
在花了大量时间进行调试并在互联网上搜索线索后,我找到了解决问题的方法。
似乎每当我通过web请求发送数据时,我的应用程序都没有使用utf-8编码对字符进行编码。这意味着从我的联系人表单发送的数据(包含æ、ø和å字符)无法通过字符编码正确处理。
该解决方案似乎在我的部署描述符中设置了一个字符编码过滤器,它将使用字符编码utf-8对来自web的所有传入请求进行编码。
此筛选器将编码设置为utf-8,并强制对url“/*”处提交的所有请求进行编码。
mgdq6dx14#
使用参数-dfile.encoding=utf-8 ex:java-dfile.encoding=utf-8-jarmyproject.jar运行项目很简单
//排错
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”)时,整个过程都很顺利。
l7wslrjt6#
在将字符串发送到send方法之前,必须将字符串转换为utf-8
如果您正在接收“请求”参数,则可以使用“setcharacterencoding”:
否则,请使用以下方法将字符串转换为utf-8格式:
这是西班牙语的结果。