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

如何使用javax.mail.internet.MimeBodyPart.setFileName保留所有字符?,java,email,jakarta-mail,rfc822,Java,Email,Jakarta Mail,Rfc822,我需要使用javax.mailversion 1.6.2创建邮件,并且希望尽可能坚持使用高级方法,并且希望避免处理字符编码、折叠以及最终获得有效邮件所必需的任何问题 我目前处理的一个问题是文件名,因为默认情况下,javax.mail.internet.MimeBodyPart.setFileName似乎以我的邮件客户端显示的与预期不同的方式对任何给定名称进行编码。考虑以下调用:在调用“代码”> StfFielNeNe/COD>时,不进行任何自定义编码,否则: meter_cnt_some_mon

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

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

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
虽然一开始看起来还可以,但我的邮件客户端将
\uu
呈现为空格:

我的邮件客户似乎正确地做出了以下决定:

(2) 8位十六进制值20(例如,ISO-8859-1空格)可以是 表示为“u”(下划线,ASCII 95)。[…]注意“u” 始终表示十六进制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?="

那么,
RFC 2047
是否能够传输包含下划线的文件名?

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

还是我做错了什么,需要提供不同的文件名?

试图用例如
=5F
来替换
\uuquot>我自己,但效果并不理想。因此,我必须能够以1:1的比例传输文件名的唯一解决方案是上述解决方法。在我看来,这是不必要的,或者至少是默认行为,如果
RFC 2047
真的那么有限的话

或者我在这里遗漏了什么?