java - 编码混合语言附件文件名
问题描述
我尝试使用 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 调用。
但在我的用例中,我可以使用混合语言文件名。
即使我更改éàè öäü русский алфавит.pdf
为2019 русский алфавит.pdf
文件名的显示仍然很糟糕。但只要离开русский алфавит.pdf
,它就会在 Gmail 中正确显示。
这是为什么?
我在 Fedora 30 上使用 Spring Boot 1.5.21 和 Java 8。
解决方案
推荐阅读
- javascript - 如何防止Android长按上的元素失去焦点?
- excel - 使用 VLOOKUP 在 excel 中的几张纸中获取单元格文本的计数
- graphql - Grouping graphql mutations
- html - 如何在一个 div 中垂直居中多个 inline-block div?
- javascript - Ext.JS:JavaScript 中的参考模型
- c++ - 将派生实现标记为 noexcept 而接口不是的副作用是什么
- r - R使用Group by和Mutate创建自定义函数
- c# - 如何使用grpc通过服务器在客户端之间发送消息?
- asp.net - 从 select2:select 事件调用 asp.net webform 回发
- c - 无符号减法,值仍算小于 0