javamail更新后的附件文件名字符集问题

x6492ojm  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(414)

从javamail 1.4.5更新到1.6.2之后,我们遇到了附件文件名字符集的问题。这些问题至少部分与 encodeparameters ,因为我们要将其设置为 false 在新版本中,以避免接收器与他们的附件有问题。这都是在windows环境中执行的。
使用javamail 1.4.5我们有这样的体验:

  1. Content-Type: application/octet-stream; name="Frammøtebekreftelse.pdf"
  2. Content-Transfer-Encoding: base64
  3. Content-Disposition: attachment; filename="Frammøtebekreftelse.pdf"

使用javamail 1.6.2我们有这样的体验:

  1. Content-Type: application/octet-stream;
  2. name*=windows-1252''Framm%F8tebekreftelse.pdf
  3. Content-Transfer-Encoding: base64
  4. Content-Disposition: attachment;
  5. filename*=windows-1252''Framm%F8tebekreftelse.pdf

我认为这是好的,但接收器有问题 name* -格式,这导致我们使用 encodeparameters=false .
使用javamail 1.6.2和 encodeparameters=false 我们有过这样的经历:

  1. Content-Type: application/octet-stream; name="Frammøtebekreftelse.pdf"
  2. Content-Transfer-Encoding: base64
  3. Content-Disposition: attachment; filename="Frammøtebekreftelse.pdf"

如你所见,这几乎是我们不想做的,除了现在ø"-性格毁了。代码的其余部分是相同的。我已经研究了设置字符编码的各种方法,但似乎没有一种方法能够解决结果的这一特定部分。
我还尝试了jakartamail1.6.5的最后一个版本,得到了相同的结果。
我需要设置什么代码或jvm选项来获得正确的结果?
代码很普通。下面是一个mcve,它应该演示这个问题:

  1. import java.io.IOException;
  2. import java.util.Properties;
  3. import javax.mail.Message;
  4. import javax.mail.MessagingException;
  5. import javax.mail.Session;
  6. import javax.mail.Transport;
  7. import javax.mail.internet.AddressException;
  8. import javax.mail.internet.InternetAddress;
  9. import javax.mail.internet.MimeBodyPart;
  10. import javax.mail.internet.MimeMessage;
  11. import javax.mail.internet.MimeMultipart;
  12. public class Mcve {
  13. public static void main(String[] args) throws AddressException, MessagingException, IOException {
  14. Properties props = System.getProperties();
  15. props.setProperty("mail.smtp.host", "localhost");
  16. props.setProperty("mail.mime.encodeparameters", "false");
  17. Session session = Session.getInstance(props, null);
  18. MimeMessage message = new MimeMessage(session);
  19. message.setFrom(new InternetAddress("email@example.com"));
  20. message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("email@example.com", false));
  21. message.setSubject("Frammøtebekreftelse");
  22. MimeMultipart multipart = new MimeMultipart();
  23. MimeBodyPart body = new MimeBodyPart();
  24. body.setContent("Hello world", "text/plain");
  25. multipart.addBodyPart(body);
  26. MimeBodyPart attachment = new MimeBodyPart();
  27. attachment.attachFile("Frammøtebekreftelse.pdf");
  28. multipart.addBodyPart(attachment);
  29. message.setContent(multipart);
  30. Transport.send(message);
  31. }
  32. }
fwzugrvs

fwzugrvs1#

为了获得javamail 1.6.2中头的旧外观,我需要添加以下两个系统属性:

  1. props.setProperty("mail.mime.encodeparameters", "false");
  2. props.setProperty("mail.mime.allowutf8", "false");

解释 mail.mime.allowutf8 从补丁说明:

  1. mail.mime.allowutf8:
  2. If set to "true", UTF-8 strings are allowed in message headers,
  3. e.g., in addresses. This should only be set if the mail server also
  4. supports UTF-8.

不幸的是,我不是完全有信心在这没有弄乱一些其他功能。从我的基本检查来看,不同之处至少在于 LineOutputStream .
1.4.5:

  1. public void writeln(String s) throws IOException {
  2. byte[] bytes = ASCIIUtility.getBytes(s);
  3. out.write(bytes);
  4. out.write(newline);
  5. }

1.6.2:

  1. public void writeln(String s) throws IOException {
  2. byte[] bytes;
  3. if (allowutf8)
  4. bytes = s.getBytes(StandardCharsets.UTF_8);
  5. else
  6. bytes = ASCIIUtility.getBytes(s);
  7. out.write(bytes);
  8. out.write(newline);
  9. }
展开查看全部

相关问题