问题1:
当附件的名称为中文时,出现乱码,导致出错。
java.io.FileNotFoundException: c:\=?UTF-8?B?5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==?= (文件名、目录名或卷标语法不正确。)问题2:
当邮件正文包含图片时,也会将正文中的图片当成附件保存,但是我只想保存真正的附件。请问有没比较好的代码,关于处理邮件接收这方面的,特殊是对附件的处理。我现在的代码如下
/**
* 判断此邮件是否包含附件
*/
public boolean isContainAttach(Part part) throws Exception {
boolean attachflag = false;
String contentType = part.getContentType();
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE))))
attachflag = true;
else if (mpart.isMimeType("multipart/*")) {
attachflag = isContainAttach((Part) mpart);
} else {
String contype = mpart.getContentType();
if (contype.toLowerCase().indexOf("application") != -1)
attachflag = true;
if (contype.toLowerCase().indexOf("name") != -1)
attachflag = true;
}
}
} else if (part.isMimeType("message/rfc822")) {
attachflag = isContainAttach((Part) part.getContent());
}
return attachflag;
} /**
* 【保存附件】
*/
public void saveAttachMent(Part part) throws Exception {
String fileName = "";
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE)))) {
fileName = mpart.getFileName();
if (fileName.toLowerCase().indexOf("gb2312") != -1) {
fileName = MimeUtility.decodeText(fileName);
}
saveFile(fileName, mpart.getInputStream());
} else if (mpart.isMimeType("multipart/*")) {
saveAttachMent(mpart);
} else {
fileName = mpart.getFileName();
if ((fileName != null)
&& (fileName.toLowerCase().indexOf("gb2312") != -1)) {
fileName = MimeUtility.decodeText(fileName);
saveFile(fileName, mpart.getInputStream());
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachMent((Part) part.getContent());
}
}
当附件的名称为中文时,出现乱码,导致出错。
java.io.FileNotFoundException: c:\=?UTF-8?B?5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==?= (文件名、目录名或卷标语法不正确。)问题2:
当邮件正文包含图片时,也会将正文中的图片当成附件保存,但是我只想保存真正的附件。请问有没比较好的代码,关于处理邮件接收这方面的,特殊是对附件的处理。我现在的代码如下
/**
* 判断此邮件是否包含附件
*/
public boolean isContainAttach(Part part) throws Exception {
boolean attachflag = false;
String contentType = part.getContentType();
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE))))
attachflag = true;
else if (mpart.isMimeType("multipart/*")) {
attachflag = isContainAttach((Part) mpart);
} else {
String contype = mpart.getContentType();
if (contype.toLowerCase().indexOf("application") != -1)
attachflag = true;
if (contype.toLowerCase().indexOf("name") != -1)
attachflag = true;
}
}
} else if (part.isMimeType("message/rfc822")) {
attachflag = isContainAttach((Part) part.getContent());
}
return attachflag;
} /**
* 【保存附件】
*/
public void saveAttachMent(Part part) throws Exception {
String fileName = "";
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition();
if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)) || (disposition
.equals(Part.INLINE)))) {
fileName = mpart.getFileName();
if (fileName.toLowerCase().indexOf("gb2312") != -1) {
fileName = MimeUtility.decodeText(fileName);
}
saveFile(fileName, mpart.getInputStream());
} else if (mpart.isMimeType("multipart/*")) {
saveAttachMent(mpart);
} else {
fileName = mpart.getFileName();
if ((fileName != null)
&& (fileName.toLowerCase().indexOf("gb2312") != -1)) {
fileName = MimeUtility.decodeText(fileName);
saveFile(fileName, mpart.getInputStream());
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachMent((Part) part.getContent());
}
}
2、图片虽然都是以附件形式发送,但在MIME里有区别的,正文图片的src是以cid:[email protected]这样的形式,而图片的文见流那也有对应的Content-ID: <[email protected]> 这就说明是正文里引用的东西,普通的附件好像没这个Content-ID几年前做的邮件项目,记不太清了!
Part.INLINE // 内联文件,就是LZ不想保存的东西
不过注意,有些服务器,会把太长的编码换成2行,那时,就要特别处理,不然解析出来的部分乱码,或者出错
* 【保存附件】
*/
public void saveAttachMent(Part part) throws Exception {
String fileName = "";
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
for (int i = 0; i < mp.getCount(); i++) {
BodyPart mpart = mp.getBodyPart(i);
String disposition = mpart.getDisposition(); if ((disposition != null)
&& ((disposition.equals(Part.ATTACHMENT)))){
// || (disposition.equals(Part.INLINE)))) {
fileName = mpart.getFileName();
if (fileName.toLowerCase().indexOf("gb2312") != -1) {
fileName = MimeUtility.decodeText(fileName);
}
saveFile(fileName, mpart.getInputStream());
} else if (mpart.isMimeType("multipart/*")) {
saveAttachMent(mpart);
} else {
fileName = mpart.getFileName();
if ((fileName != null)
&& (fileName.toLowerCase().indexOf("gb2312") != -1)) {
fileName = MimeUtility.decodeText(fileName);
saveFile(fileName, mpart.getInputStream());
}
}
}
} else if (part.isMimeType("message/rfc822")) {
saveAttachMent((Part) part.getContent());
}
}
=? UTF-8 ? B ? 5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA ==?=
你可以看到这里已经是utf-8了,不过也可以看出,这里是有固定格式的,就是=?***?*?*******?=
所以上面那个表达式,应该改改
=?UTF-8?B?5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==?=
=? ?= 说明文件名是编码了
抛开?分隔符
UTF-8是原来字符串的编码方式(好象是)
B 是采用的base64转码 (还有其他的转码方式的)
5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA== 就是转码后的文件名
-------
转换前:=?UTF-8?B?w6XCruKAsMOkwr/CocOkwrrFksOmxZPFuMOkwrzLnMOlxZLigJPDqMKn?= =?UTF-8?B?4oCew6XLhuKAmS5wbmc=?=
转换后:????‰????????????????????????????–è§??????’.png
转换前:=?UTF-8?B?w6XCsCDDp8K74oCew6jCp+KAnsOly4bigJkgKDEpLnBuZw==?=
转换后:??° ??????è§??????’ (1).png转换前:=?UTF-8?B?5a6J5L+h5LqM5pyf5LyY5YyW5pa55qGILm9kdA==?=
转换后:测试用.doc
-------