【问题标题】:Java Mail API - Encoding problemsJava Mail API - 编码问题
【发布时间】:2012-12-08 11:45:10
【问题描述】:

我正在使用 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] 仍然充满了 ? 和 [])。

【问题讨论】:

  • 如何设置strVar?如果在mailMessate.setText(..) 之前立即分配strVar 会怎样?也许您从扫描仪收到的内容与有效的字符串不同。
  • 我稍微修改了代码以允许我发送 HTML,所以我的发送方法是:message.setContent("<h5>[õäöü]</h5><h1>" + strVar + "</h1>", "text/html"); 当我收到邮件时,HTML 被正确解析,“[õäöü]”也是如此,但strVar 似乎“来”不正确。我有一个类Inputget() 里面的方法:public String get(){ /* Scanner declaration here */ return scanner.nextLine(); } 在第二类MailSender 我像这样初始化strVar:` /* 输入类声明 */ String strVar = input.get(); ` // 抱歉,这里很难写代码 :)
  • 你能检查一下字符串中有哪些实际字符(以及它与有效情况下的字符相比如何)?
  • 当然,您可以在这里看到输出:link 输出有点奇怪,我在两个 IDE(IntelliJ 和 Netbeans)中运行我的程序。我使用他们自己的控制台进行输入 [Scanner(System.in)]。 Intellij 似乎正确输出了所有内容,但 Netbeans 输出错误。图片上的第一行(CMD)。它实际上是一个由 Netbeans 制成的罐子。它得到了正确的主题行(Netbeans 没有)但正文没问题(在 netbeans IDE 的控制台中相同)。 “Häid Jõule”在爱沙尼亚语中意为圣诞快乐 :)
  • 那么问题可能不在于 JavaMail,而在于控制台的编码,但不知道如何更改。

标签: java api email encoding jakarta-mail


【解决方案1】:

您应该使用setText(String text, String charset)setText(String text, String charset, String subtype) 将文本正文设置为特定编码。

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

【讨论】:

  • 我使用了这个:mailMessage.setText("input from Scanner here", "ISO-8859-1"); 但没有任何改变...还有什么问题?
【解决方案2】:
    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")

【讨论】:

  • 使用setText 也将设置Content-Type 标头(如果您查看代码,您会看到现有的Content-TypeContent-Transfer-Encoding 标头在使用@987654328 设置任何内容后被删除@ 或 setContent)
  • @MarkRotteveel 谢谢,我会删除多余的setHeader("Content-Type", "text/plain; charset=UTF-8")
  • message.setText(body, "text/plain; charset=UTF-8") 或类似的东西在 Windows 10 默认邮件应用程序(有时在 Outlook 中)中对某些斯拉夫字母不起作用。我通过使用MimeBodyPart 并在其上设置setHeader("Content-Type", "text/plain; charset=UTF-8") 解决了它。至于主题,message.setSubject(subject, "UTF-8") 非常适合斯拉夫字符(没有它,即使 gmail 也无法识别 'č' 字符)。
  • @bartac 我已经添加了您的解决方案。可能是丰富的(带有纯文本的 mime 部分)和纯消息之间的区别。
【解决方案3】:

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

【讨论】:

  • 大家好,我对法语字符有同样的问题,我试过这个代码:MimeMessage message = new MimeMessage(session); message.setSubject(主题,“UTF-8”); message.setBody(body, "UTF-8");正文生成正确,但主题我没有正确。有人可以帮助我
【解决方案4】:

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");

【讨论】:

    【解决方案5】:

    以下内容对我有用:

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

    其中subjectbody 是没有特殊处理的常规字符串对象(代码和用户界面使用UTF-8)。

    【讨论】:

      【解决方案6】:
      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);
      

      【讨论】:

        【解决方案7】:

        如果你使用 HTML 消息,试试这个:

        Message message = new MimeMessage(session);
        message.setContent(htmlText, "text/html; charset=UTF-8");
        

        【讨论】:

          【解决方案8】:

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

          mail.setContent(testMail.getTexto(), "text/plain; charset=ISO-8859-1");
          

          【讨论】:

          • 为什么不用 UTF-8?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-07-17
          • 2010-10-16
          相关资源
          最近更新 更多