浅析JavaMail发送邮件后再通过JavaMail接收格式问题
复杂邮件发送问题
关于JavaMail如何发送邮件这里就不赘述了,网上有很多例子。其中最复杂的邮件发送莫过于html邮件包含内嵌图片以及附件,最近项目中的这项功能我在发送邮件时就出现了一系列问题。
我在使用JavaMail发送了邮件之后,会再次通过JavaMail将其获取回来进行解析,由于发送操作不当,导致了解析就不是那么回事了。
接下来先看看正常的解析过程吧。关于邮件的解析,网上依然有很多例子。
privatestaticvoidmultipartMailParser(Multipartmail)throwsException{ intcount=mail.getCount(); System.out.println("partcount:"+count); for(inti=0;iString[]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