首页 > 解决方案 > 编码混合语言附件文件名

问题描述

我尝试使用 Spring 的 MimeMessageHelper 发送一封电子邮件,其中包含来自不同语言的字符的附件:

MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED, StandardCharsets.UTF_8.name());
// ...
helper.addAttachment("éàè öäü русский алфавит.pdf", bytes, "application/pdf");

无论我做什么,Gmail 中的文件名总是如下所示:

?UTF-8?B?0JDQutGC0LXRgNGLLdCb0Y7QutGB0LXQvNCx0YPRgA==?= =?UTF-8?B?0LMtMjAxOS0xMSDQvNCw0Y8ucGRm?=

我试过了:

MimeUtility.encodeText("éàè öäü русский алфавит.pdf", StandardCharsets.UTF_8.name(), "Q");
MimeUtility.encodeWord(...) // same result

并设置:

System.setProperty("mail.mime.splitlongparameters", "false");
System.setProperty("mail.mime.encodeparameters", "false"); // or true
System.setProperty("mail.mime.charset", "utf-8");

不做任何改变。

如果我从文件名中删除非西里尔字符 (éàè öäü),则文件名编码良好,无需任何 MimeUtility.encode 调用。

但在我的用例中,我可以使用混合语言文件名。

即使我更改éàè öäü русский алфавит.pdf2019 русский алфавит.pdf文件名的显示仍然很糟糕。但只要离开русский алфавит.pdf,它就会在 Gmail 中正确显示。

这是为什么?

我在 Fedora 30 上使用 Spring Boot 1.5.21 和 Java 8。

标签: javaencodingjakarta-mail

解决方案


推荐阅读