我已经使用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); }
请帮助我找出如何纠正此“错误”。
有两个与mailing相关的系统属性,可能会简化您的代码。我实际上是在谈论此特定属性:"mail.mime.charset"。
"mail.mime.charset"
该 mail.mime.charset 系统属性可以用来 指定默认MIME字符集 用于编码的单词和文本部分不另行指定一个字符集。通常,默认的MIME字符集是从file.encodingSystem属性中指定的默认Java字符集派生的。大多数应用程序无需显式设置默认的MIME字符集。如果用于邮件的默认MIME字符集与用于存储在系统上的文件的字符集不同,则应设置此属性。
mail.mime.charset
file.encoding
如上文所述,默认情况下没有的值,mail.mime.charset并且使用文件编码(file.encoding属性)。
但是,如果要为特定的电子邮件指定特定的编码,则可能应使用2参数setSubject(subject,charset)和setText(text,charset)方法。
setSubject(subject,charset)
setText(text,charset)
如果那不起作用,则可能是您的输入在此之前已损坏。 换句话说,您可能使用了错误的编码来收集数据。
的setContent(content, "UTF-8")(其他消息来源)将只是不工作。只需查看此方法的签名即可:setContent(Object content, String mimetype)。 哑剧类型和字符集是两个完全不同的东西。 恕我直言,您实际上应该使用setText(...)带有charset参数的方法之一。
setContent(content, "UTF-8")
setContent(Object content, String mimetype)
setText(...)
但是,如果您坚持使用mimetype来设置charset setContent(content,mimetype),那么请使用正确的格式。(不只是"UTF-8",还包括"text/plain; charset=UTF-8")。但更重要的 是,请注意,每种mime类型都有其自己的处理字符集的方式。
setContent(content,mimetype)
"UTF-8"
"text/plain; charset=UTF-8"
text/plain
US-ASCII
text/xml
text/html
ISO-8859-1
Latin-1