如何使用 javax.mail.internet.MimeBodyPart.setFileName 保留所有字符?

2024-04-16

我需要使用创建邮件javax.mail版本 1.6.2,希望尽可能坚持高级方法,并希望避免自己处理字符编码、折叠以及最终获得有效邮件所需的任何内容。

我目前正在处理的一个问题是文件名,因为默认情况下javax.mail.internet.MimeBodyPart.setFileName似乎以我的邮件客户端显示的方式与预期不同的方式对任何给定名称进行编码。考虑在调用中转发的以下名称setFileName没有任何自定义编码,否则:

meter_cnt_some_month_summary äöüßÄÖÜ.xml

生成的邮件结果如下所示:

Content-Type: application/xml; charset=UTF-8; 
    name*=UTF-8''meter_cnt_some_month_summary%20%C3%A4%C3%B6%C3%BC%C3%9F%C3%84%C3%96%C3%9C.xml
Content-Disposition: attachment; 
    filename*=UTF-8''meter_cnt_some_month_summary%20%C3%A4%C3%B6%C3%BC%C3%9F%C3%84%C3%96%C3%9C.xml

虽然一开始看起来不错,但我的邮件客户端呈现_作为空间:

根据我的邮件客户端的说法,这个决定似乎是正确的RFC 2047 https://www.rfc-editor.org/rfc/rfc2047:

(2) 8 位十六进制值 20(例如 ISO-8859-1 SPACE)可以是 表示为“_”(下划线,ASCII 95。)。[...]请注意“_” 始终表示十六进制 20,即使空格字符 在所使用的字符集中占据不同的代码位置。

支持RFC 2047最近才添加到包中,可以通过设置特殊的系统属性来禁用FALSE。但这并不能解决问题,因为这只会导致标头中出现客户端无法充分利用的 UTF-8 字节。

System.setProperty("mail.mime.encodeparameters", Boolean.FALSE.toString())

Content-Type: application/xml; charset=UTF-8; 
    name="meter_cnt_some_month_summary äöüßÄÖÜ.xml"
Content-Disposition: attachment; 
    filename="meter_cnt_some_month_summary äöüßÄÖÜ.xml"

我需要做的是像上面一样设置系统属性,并另外负责自己对文件名进行编码。但这正是我希望避免的。

name = MimeUtility.encodeText(name, "UTF-8", "Q");

Content-Type: application/xml; charset=UTF-8; 
    name="=?UTF-8?Q?meter=5Fcnt=5Fsome=5Fmonth?=
 =?UTF-8?Q?=5Fsummary_=C3=A4=C3=B6=C3=BC=C3=9F=C3=84=C3=96=C3=9C.xml?="
Content-Disposition: attachment; 
    filename="=?UTF-8?Q?meter=5Fcnt=5Fsome=5Fmonth?=
 =?UTF-8?Q?=5Fsummary_=C3=A4=C3=B6=C3=BC=C3=9F=C3=84=C3=96=C3=9C.xml?="

So, is RFC 2047能够传输包含下划线的文件名吗?

我想这是通过简单地对下划线本身进行编码,仅留下空格因某种原因被下划线替换。奥托,如果javax.mail不支持它,这可能是一个已知的限制。

或者我做错了什么并且需要提供不同的文件名?

尝试更换_我自己,例如=5F,但这并没有那么有效。因此,我必须能够以 1:1 的方式传输文件名的唯一解决方案是上面的解决方法。在我看来,这应该是不必要的,或者至少是默认行为,如果RFC 2047确实有那么有限。

或者我在这里缺少什么?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 javax.mail.internet.MimeBodyPart.setFileName 保留所有字符? 的相关文章

随机推荐