12

我正在使用 Java Mail API,并且正在尝试通过 Gmail 的 SMTP 发送电子邮件。我的程序是如何工作的: java.util.Scanner 类用于获取用户输入 - 我正在向用户询问要在邮件发送类中使用的各种参数;它执行以下操作:

Message mailMessage = new MimeMessage(session);
mailMessage.setFrom(new InternetAddress("example@example.com"));
mailMessage.setRecipients(Message.RecipientType.TO,InternetAddress.parse(mail.getTo()));
mailMessage.setSubject(mail.getSubject());
mailMessage.setText(mail.getMessage());
Transport.send(mailMessage);

只要我使用 ASCII 符号/字符,一切正常。但是,每当我想使用“特定于国家/地区”的字符时——比如 [õäöü]——我都会得到一堆看起来很奇怪的符号......

到目前为止我使用的技术(对我不起作用):

setHeader("Content-Type", "text/plain; charset=UTF-8");
setHeader("Content-Encoding","ISO-8859-9");
setContent(message, "text/plain; charset=iso-8859-2");

注意:当执行 System.out.println() 以显示要发送的消息时,IDE 中的所有内容都会正确显示。

编辑:例如,当发送的邮件正文为 [õäöü] 它在 Gmail 中显示为 [ä„”?]。

编辑:mailMessage.setText(MimeUtility.encodeText(mail.getMessage(), "UTF-8", "Q"));使用时,Gmail 中的输出如下:

"=?UTF-8?Q?=C3=A4=E2=80=9E=E2=80=9D=EF=BF=BD;=0D=0A?="

另一个编辑:有趣的是,当我这样做时:mailMessage.setText(strVar + "õäöü", "ISO-8859-1"); 它实际上在我的电子邮件中很好地附加了“õäöü”(但字符串的第一部分 [strVar] 仍然充满了?和 [])。

4

8 回答 8

14
    MimeMessage message = new MimeMessage(session);
    message.setSubject(subject, "UTF-8");
    message.setText(body, "UTF-8");

因此,必须为正文和主题设置字符编码。


由于@bartac 的评论而出现的附录

为对应MimeBodyPart做一个setHeader("Content-Type", "text/plain; charset=UTF-8")

于 2012-12-20T22:36:30.743 回答
5

您应该使用setText(String text, String charset)orsetText(String text, String charset, String subtype)设置具有特定编码的文本正文。

MimeUtility.encodeText()不适用于正文,而仅适用于标头中的编码文本(然后仅适用于使用setHeaderor设置的标头addHeader)。

于 2012-12-20T22:25:18.760 回答
2

基本上,我的代码工作得很好,就像它应该做的那样。是 cmd,无法处理非 ascii 字母。我使用了一个 bat 文件来访问一个 jar。我想我只是要做一个小GUI...谢谢大家的回答。

于 2012-12-23T11:17:48.860 回答
2

以下对我有用:

MimeMessage message = ...
message.setSubject(subject, "UTF-8");
message.setContent(body, "text/plain; charset=UTF-8");

wheresubjectbody是没有特殊处理的常规 String 对象(代码和用户界面使用 UTF-8)。

于 2016-04-12T11:06:01.060 回答
1

1-考虑您想发送一封正文中包含此字符串的电子邮件:

"Olá João!"

2 - 由于代码在 GAE 服务器中运行,此字符串使用默认的 ASCII 编码进行解释。要使用正确的重音字符发送此电子邮件,请将字符串定义为:

String body = "Ol\u00e1 Jo\u00e3o!";

特殊字符是使用其 UTF-8 代码手动定义的。在表中搜索您需要的代码http://www.utf8-chartable.de/

3- 将字符串编码转换为 UTF-8。现在将正确解释所有手动输入的代码:

Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
String encodedSubject = new String (subject.getBytes("UTF-8"),"UTF-8");
String encodedBody = new String (body.getBytes("UTF-8"),"UTF-8");
message.setSubject(encodedSubject, "UTF-8");
message.setText(encodedBody, "UTF-8");
于 2015-02-23T17:58:32.170 回答
0
JavaMailSenderImpl emailSender = new JavaMailSenderImpl();
mailSender.setHost("...");

MimeMessage message = emailSender.createMimeMessage();
message.setSubject("...", "UTF-8");
message.setText("...", "UTF-8");

MimeMessageHelper helper = new MimeMessageHelper(message, "UTF-8");
helper.setFrom(from);
helper.setTo(to);

emailSender.send(message);
于 2018-09-10T10:02:05.143 回答
0

如果您使用 HTML 消息,请尝试以下操作:

Message message = new MimeMessage(session);
message.setContent(htmlText, "text/html; charset=UTF-8");
于 2018-11-07T15:45:28.337 回答
0

以下字符集对我有用:charset=ISO-8859-1,例如:

mail.setContent(testMail.getTexto(), "text/plain; charset=ISO-8859-1");
于 2019-11-05T17:07:34.477 回答