问题
使用网易邮箱,qq邮箱,新浪邮箱,企业邮箱都是正常的,再使用139邮箱发送附件,发现邮件存到草稿箱或者是已发送文件夹的时候,附件为图片的时候可以解析出来,其他的文档类就无法解析,登录网页端查看附件,发现附件文件明不正确。
然后我以为文件明编码格式的问题,修改了 MimeUtility.decodeText() 文件名编码,使用UTF-8,GBK等还是一样,后面不转编码,直接发,发现网页端是正常显示了,但是客户端收到解析又解析不了,以为是解析的方式不对,又在解析上纠结了好久,之后在网页端发一条,发现解析是没有问题的,那么又回到了原点,添加附件方式有问题,最后在客户端发一条,再把收到的邮件打印出来跟网页端发送的邮件做对比发现缺少Content-Type类型定义。
log对比:
客户端发送的:
bodyPart.getContentType():application/octet-stream==mimtype:multipart/mixed;
boundary="----=_Part_0_208183443.1610357486667"
网页端发送的:
bodyPart.getContentType():application/vnd.openxmlformats-officedocument.wordprocessingml.document;
charset=utf-8;
name="=?UTF-8?B?5omL5py65a6J5YWo5rWL6K+V5oql5ZGKLmRvY3g=?="==mimtype:multipart/mixed;
boundary="----=_Part_52648_361362599.1610415676840"
发现bodyPart.getContentType()没有name这个字段,查找资料,原来需要添加BodyPart.addHeader(“Content-Type”,value)
参考:Java BodyPart.addHeader方法代码示例
再推荐一篇,写的很详细,代码也清晰易懂:javaMail邮件接收解析内容及附件 及删除邮件
本人使用的是MailKit框架开发,因为是人家基于JavaMail封装好的,使用起来很方便。
回到刚才的问题,直接贴上代码:
//创建多重消息对象
MimeMultipart multipart = new MimeMultipart();
//文本内容
if (draft.getText() != null) {
MimeBodyPart textBodyPart = new MimeBodyPart();
textBodyPart.setText(draft.getText(), "UTF-8");
multipart.addBodyPart(textBodyPart);
}
//HTML内容
if (draft.getHTML() != null) {
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(draft.getHTML(), "text/html; charset=UTF-8");
multipart.addBodyPart(htmlBodyPart);
}
//设置附件
List<File> fileList = draft.getAttachmentList();
for (File file : fileList) {
MimeBodyPart attachmentBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(file);
String fileName = TextUtils.encodeText(source.getName());
attachmentBodyPart.setFileName(fileName);
attachmentBodyPart.setDataHandler(new DataHandler(source));
attachmentBodyPart.setDisposition(Part.ATTACHMENT);
String value = TextUtils.getMimeType(fileName)+"; name="+fileName;
attachmentBodyPart.addHeader("Content-Type",value);
multipart.addBodyPart(attachmentBodyPart);
multipart.setSubType("mixed");
}
//设置消息对象
message.setContent(multipart);
TextUtils文本编码转换
/**
* 文本编码转换
*/
static class TextUtils {
static String encodeText(String s) {
try {
return MimeUtility.encodeText(s);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return s;
}
}
static String decodeText(String s) {
try {
Log.e("===", "decodeText: "+s );
return (s.startsWith("=?")) ? MimeUtility.decodeText(s) : s;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return s;
}
}
static String getMimeType(String filename) {
int begin = filename.lastIndexOf('.');
String suffix = filename.substring(begin + 1);
return MimeTypeMap
.getSingleton()
.getMimeTypeFromExtension(suffix);
}
}
结束,在这里记录一下。