浅析JavaMail发送邮件后再通过JavaMail接收格式问题
复杂邮件发送问题
关于JavaMail如何发送邮件这里就不赘述了,网上有很多例子。其中最复杂的邮件发送莫过于html邮件包含内嵌图片以及附件,最近项目中的这项功能我在发送邮件时就出现了一系列问题。
我在使用JavaMail发送了邮件之后,会再次通过JavaMail将其获取回来进行解析,由于发送操作不当,导致了解析就不是那么回事了。
接下来先看看正常的解析过程吧。关于邮件的解析,网上依然有很多例子。
privatestaticvoidmultipartMailParser(Multipartmail)throwsException{
intcount=mail.getCount();
System.out.println("partcount:"+count);
for(inti=0;i
String[]cids=bodyPart.getHeader("Content-Id");
System.out.println("=========>cids:"+(cids==null?"NULL":cids.length));
Stringcontent="",cid="";
if(cids!=null&&cids.length>0){
content=cids[0];
if(content.startsWith("<")&&content.endsWith(">")){
cid="cid:"+content.substring(1,content.length()-1);
}else{
cid="cid:"+content;
}
}
System.out.println(content+"---"+cid);
System.out.println(bodyPart.getContentType());
if(bodyPart.isMimeType("text/plain")){
System.out.println("纯文本邮件:"+bodyPart.getContent());
}elseif(bodyPart.isMimeType("text/html")){
System.out.println("html邮件:"+bodyPart.getContent());
}elseif(bodyPart.isMimeType("multipart/*")){
Multipartpart=(Multipart)bodyPart.getContent();
multipartMailParser(part);
}elseif(bodyPart.isMimeType("application/octet-stream")){
Stringdisposition=bodyPart.getDisposition();
System.out.println("任意的二进制数据:"+disposition);
//这里就是对附件进行解析
if(disposition.equalsIgnoreCase(BodyPart.ATTACHMENT)){
StringfileName=bodyPart.getFileName();
System.out.println("------------------------保存附件"+fileName);
InputStreamis=bodyPart.getInputStream();
Filefile=newFile("C:\\Users\\AB\\Desktop\\mail\\"+fileName);
copy(is,newFileOutputStream(file));
}
}elseif(bodyPart.isMimeType("image/*")&&!("".equals(cid))){
//内嵌图片处理
DataHandlerdataHandler=bodyPart.getDataHandler();
Stringname=dataHandler.getName();
System.out.println("内嵌图片NAME:"+name);
InputStreamis=dataHandler.getInputStream();
Filefile=newFile("C:\\Users\\AB\\Desktop\\mail\\"+name);
copy(is,newFileOutputStream(file));
}
}
}
privatestaticvoidcopy(InputStreamis,OutputStreamos)throwsIOException{
byte[]bytes=newbyte[1024];
intlen=0;
while((len=is.read(bytes))!=-1){
os.write(bytes,0,len);
}
if(os!=null)
os.close();
if(is!=null)
is.close();
}
使用以上方法对邮件进行解析是没有问题的,内嵌图片、附件都是可以分开解析的。但在我解析通过JavaMail发送的邮件时就出现了问题。
先看看最初是怎么发送的吧。这里就不贴完整代码了,我就是按照文章开始链接对应的文章进行了修改。
//这里只给出附件节点创建方法吧 //给出参数accessory(附件信息)格式为:zxd.jpg-C:/Users/AB/Desktop/zxd.jpg,lyf.jpg-C:/Users/AB/Desktop/lyf.jpg,htmlFile-C:/Users/AB/Desktop/file.html,golang-C:/Users/AB/Desktop/Demo.go privateListmailAttachmentParts(Stringaccessory)throwsMessagingException,UnsupportedEncodingException{ //附件节点集合 List attachments=newArrayList<>(); MimeBodyPartattachment; DataHandlerdh; String[]accs=accessory.split(","); for(finalStringacc:accs){ String[]ac=acc.split("-"); //按照网上文章的例子,这里只需要进行如下设置即可 attachment=newMimeBodyPart(); dh=newDataHandler(newFileDataSource(ac[1])); attachment.setDataHandler(dh); attachments.add(attachment); } returnattachments; }
发送后,查看去邮件服务器中查看,邮件是正常的。但是我再通过JavaMail获取就出现问题了。输出如下:(//…为我给出的注释)
partcount:5 =========>cids:NULL --- multipart/related; boundary="----=_Part_2_1562389956.1559641692502" partcount:2 =========>cids:NULL --- text/html;charset=UTF-8 //邮件内容正常获取 html邮件:这是邮件发送测试十二
这依然是刘亦菲//内嵌图片也正常获取 =========>cids:1 liuyifei---cid:liuyifei image/jpeg;name=lyf2.jpg 内嵌图片NAME:lyf2.jpg =========>cids:NULL --- image/jpeg;name=zxd.jpg//附件图片获取失败,可以看见前面为image/jpeg,也就是说JavaMail并没有将其作为附件进行处理 =========>cids:NULL --- image/jpeg;name=lyf.jpg//附件图片获取失败 =========>cids:NULL --- //最可笑的是居然将我的file.html文件当做了text/html来进行了处理,没有将html文件保存到本地,而是直接输出了其中的内容 //我在手机邮件app中查看这封邮件的时候,我的邮件内容并不是上面打印的内容,而是这个html文件中的内容 text/html;charset=us-ascii;name=file.html html邮件: fileupload