我使用 Java 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);
}
请帮我找出如何纠正这个“错误”。
原文由 Rohwedder 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于所有电子邮件
有几个 与 mailing 相关的系统属性,它们可能会简化您的代码。我实际上是在谈论这个特定的属性:
"mail.mime.charset"
。正如您在上面看到的,默认情况下
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 类型都有自己处理字符集的方式。text/plain
的默认字符集是US-ASCII
,但可以用额外的字符集参数来否决。text/xml
类型使用消息内容确定字符集。 字符集参数将在这里被忽略。text/html
应该总是指定一个字符集。但如果你不这样做,那么它将使用ISO-8859-1
(=Latin-1
)。