我可以在JavaMail中发送具有非ascii文件名的附件,但我无法下载它们.我特意为那些文件名包含非ascii字符的附件获取java.io.FileNotFoundException.
仅供参考:我使用的方法是messageBodyPart.setFileName(MimeUtility.encodeText(filename[i])) 对文本进行编码并MimeUtility.decodeText(bodyPart.getFileName())解码非ascii文件名
这有解决方法吗?
编辑 @Bill,这是我的代码的一部分,读取附件.我还在我的代码中添加了properties.setProperty("mail.mime.decodeparameters","true")和properties.setProperty("mail.mime.decodefilename","true")属性.
if (message[a].getContent() instanceof MimeMultipart) {
Multipart multipart = (Multipart) message[a].getContent();
for (int i = 0; i < multipart.getCount(); i++) {
bodyPart = multipart.getBodyPart(i);
disposition = bodyPart.getDisposition();
if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT) || (disposition.equals(BodyPart.INLINE)))) {
DataHandler handler = bodyPart.getDataHandler();
String path = bodyPart.getFileName();
String[] str = path.split("/");
String fileName = str[str.length - 1];
String filePath = ReadConfigPropertiesFile.getPropertyValue("server.buildpath");
System.out.println(fileName);
File tempDir = new File(filePath + user);
if (!tempDir.exists()) {
tempDir.mkdir();
}
File saveFile = new File(tempDir + "/" + fileName);
int count = 0;
while (saveFile.exists()) {
count++;
saveFile = new File(tempDir + "/" + count + "_" + fileName);
}
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile));
byte[] buff = new byte[2048];
InputStream is = bodyPart.getInputStream();
int ret = 0;
while ((ret = is.read(buff)) > 0) {
bos.write(buff, 0, ret);
}
bos.close();
is.close();
//System.out.println(bodyPart.getContentType());
}else {
//display body (message) of the attachment;
//System.out.println(bodyPart.getContent().toString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(saveFile))在行上引发了FileNotFoundException异常,并且对于文件名为非ascii字符的附件(类似于ሰላም.pdf)引发了这种情况.其他一切都很好.
此答案来自@semytech(OP)的评论。在这里很难找到它,因此我将其添加为答案以提高可见性。它帮助了我使用希伯来语文件名。
MimeBodyPart attachment = new MimeBodyPart();
attachment.setFileName(MimeUtility.encodeText(filename, "UTF-8", null));
Run Code Online (Sandbox Code Playgroud)
您永远不需要自己进行编码或解码。
您可以设置两组属性来告诉 JavaMail 为您进行编码/解码:
有关详细信息,请参阅javax.mail.internet包的 javadocs 。
第一组使用非标准编码技术,类似于您自己所做的。这对于一些使用此技术的旧邮件程序来说效果很好。
第二组使用 MIME 标准编码技术。该版本适用于大多数现代邮件程序。
这些都不能解释为什么您会收到 FileNotFoundException,但是您没有提供足够的详细信息来了解收到异常时您在做什么。
| 归档时间: |
|
| 查看次数: |
4808 次 |
| 最近记录: |