使用 javaMail 检索附件文件名时出现问题



我有一个插件可以处理一些邮件,所以我需要从IMAP邮件中获取附件并做一些事情。

一切似乎都可以工作,但我有一封邮件有一个奇怪的附件标题,我无法正确获取它,这里是附件标题:

    --_01d0aeb2-3f01-4153-9121-66b7af6924f1_
Content-Type: application/msword
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=
    "=?iso-8859-1?Q?Atto_Aziendale_(xxx=E0_del_xxx_xxx_-_xxx)=2C_Pr?=
 =?iso-8859-1?Q?of.xxx_xxx_-_Dr.xxx_xxx.doc?="

"x"是为了隐私,但这应该不重要,问题是当我尝试使用 javaMail 获取此附件的文件名时:

Attachment att = new Attachment(mailPart);
String filename = att.getFilename();

我只得到这个:"阿托·阿齐恩代尔 (xxx del xxx xxx - xxx), 公关"

似乎它没有阅读第二行。

我还尝试以另一种方式获取文件名:

mailPart.getHeader("Content-Disposition").getAttribute("filename").toString();

返回:文件名="=?ISO-8859-1?Q?Atto_Aziendale_(xxx=E0_del_xxx_xxx_-_xxx)=2C_Pr?==?iso-8859-1?Q?of.xxx_xxx_-_Dr.xxx_xxx.doc?="

所以看起来该属性被正确读取,但如果我尝试获取:

mailPart.getHeader("Content-Disposition").getAttribute("filename").getValue();

然后我再次得到一个截断的文件名:"Atto Aziendale (

xxx del xxx xxx - xxx), Pr"

有人知道如何获取完整的文件名或我应该如何解码文件名属性吗?

感谢您的任何帮助

如果您使用的是 IMAP,IMAP 服务器将解析邮件头并将解析的值返回到 JavaMail 客户端。 内容处置标头有多个延续行。 IMAP 服务器需要正确组合这些延续行并返回参数值。 看起来服务器省略了延续行所暗示的空格,并将"?="与"=?"连接起来。 它们之间没有空格,它们似乎是一个编码的单词而不是两个,这可能解释了为什么在解码它们时会得到错误的结果。

尝试将系统属性"mail.mime.decodetext.strict"设置为"false";这可能允许JavaMail解码该值。 有关详细信息,请参阅 javax.mail.internet 软件包的 javadocs。

最新更新