【问题标题】:Problem with subject encoding when sending an email发送电子邮件时的主题编码问题
【发布时间】:2011-06-21 08:02:51
【问题描述】:

我正在发送一封电子邮件并且我正确地收到了它,但主题的编码不正确。我正在发送“invitación”,但收到的是“invitaci?n”。消息内容OK。

消息的内容来自速度模板的转换,而主题设置在字符串变量中。

我搜索了一下,发现有人说 MimeUtility.encodeText() 可以解决问题,但我没有成功。

我该如何解决这个问题?这是我目前的代码。

String subject = "Invitación";
String msgBody = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/vmTemplates/template.vm", "UTF-8", model);

Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);

try {
    String encodingOptions = "text/html; charset=UTF-8";
    Message msg = new MimeMessage(session);
    msg.setHeader("Content-Type", encodingOptions);
    msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom));
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));

    msg.setSubject(subject);
    msg.setContent(msgBody, encodingOptions);
    Transport.send(msg);

    } catch (AddressException e) {
        ...
    } catch (MessagingException e) {
        ...
    } 

谢谢

【问题讨论】:

    标签: java google-app-engine encoding jakarta-mail velocity


    【解决方案1】:

    我已经在我的一个项目中实现了 emailService,并且我正在使用 MimeMessageHelper 和 MimeMailMessage。请参考以下代码。

    private String sendEmail() {
      MimeMessage mimeMessage = EmailSenderFactory.INSTANCE.getEmailSender().createMimeMessage();
      MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
      mimeMessageHelper.setTo("YourToEmailId");
      mimeMessageHelper.setFrom("YourFromEmailId");
      mimeMessageHelper.setBcc("YourBccEmailId");
      mimeMessageHelper.setSubject("YourEmailSubject");
      mimeMessageHelper.setText("YourEmailContent", true);
      mimeMessageHelper.addAttachment("DocumentName", new ByteArrayDataSource("Document data in byte[]", "Document Content Type"));
      MimeMailMessage mimeMailMessage = new MimeMailMessage(mimeMessageHelper);
      return EmailSenderFactory.INSTANCE.getEmailSender().send(mimeMailMessage);
    }
    

    【讨论】:

      【解决方案2】:

      就我而言,唯一可行的是将系统语言环境更改为支持所需字符集的语言环境。 在此之前,我尝试了许多不同的方法,包括从这个线程中接受的答案,但都没有帮助。

      【讨论】:

        【解决方案3】:

        你可以使用,它有效

        msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));
        

        【讨论】:

          【解决方案4】:

          JavaMail 的抽象可能有点过多,而您在这里会成为它的牺牲品。当你使用

          Message msg = new MimeMessage(session);
          

          您正在创建一个MimeMessage 对象,但将其视为Message 对象。 Message 只有一个setSubject(String subject) 方法,它使用平台默认字符集对主题进行编码。如果平台默认值无法对其进行编码,则会在生成的标头中获得 ? 字符。但是,MimeMessage 有一个 setSubject(String subject, String charset) 方法,它允许您指定要用于对主题进行编码的字符集。所以只需将您的代码切换为

          MimeMessage msg = new MimeMessage(session);
          msg.setHeader("Content-Type", encodingOptions);
          msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom));
          msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
          
          msg.setSubject(subject, "UTF-8");
          

          它应该可以工作。

          【讨论】:

          • Message 的唯一交付子类是 MimeMessage。我怀疑是否有人实现了另一个子类。如果它们刚刚崩溃 javax.mailjavax.mail.internet,JavaMail 就不会那么糟糕了——额外的抽象层意味着你不断地转换到子类。
          • 这并没有解决我的问题(在主题行中发送 £ 符号)
          • @Mark:你试过msg.setSubject("\u00a3", "UTF-8"),但它没有正确编码主题?生成的主题标头中有什么?
          • 对不起。我解决了我的问题,与 subect 编码无关 - 它与读取用于填充主题的文件有关,因此在添加到消息之前我的主题字符串不正确。
          • @dkarp:我一直认为拼写是“Groddy”......我已经纠正了:)
          【解决方案5】:

          或许你可以试试:msg.setSubject(subject, "UTF8");

          【讨论】:

          • javax.mail.Message 没有这个方法。我正在使用 AppEngine 提供的 Java Mail API。
          • 哦,对不起!我没有注意到这与 AppEngine 相关!
          • 我一开始忘记了。我稍后编辑了这篇文章,将其标记为 AppEngine。还是谢谢。
          猜你喜欢
          • 2011-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-02
          • 1970-01-01
          • 2014-11-21
          • 2015-10-16
          • 2011-09-22
          相关资源
          最近更新 更多