1

我有一个应该处理一些邮件的插件,所以我需要从 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();

我只得到这个:“Atto Aziendale (xxx del xxx xxx - xxx), Pr”

似乎它没有读取第二行。

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

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

然后返回: 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?= "

所以似乎该属性已正确读取,但如果我尝试获取:

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

然后我再次得到一个截断的文件名:“Atto Aziendale (xxx del xxx xxx - xxx), Pr”

任何人都知道如何获得完整的文件名或我应该如何解码文件名属性?

谢谢你的帮助

4

1 回答 1

3

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

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

于 2013-01-28T21:06:14.267 回答