java 发送邮件 格式_JavaMail发送邮件后再通过JavaMail接收格式问题
关于 JavaMail 如何发送邮件这里就不赘述了,网上有很多例子。其中最复杂的邮件发送莫过于 html邮件包含内嵌图片以及附件,最近项目中的这项功能我在发送邮件时就出现了一系列问题。
我在使用 JavaMail 发送了邮件之后,会再次通过 JavaMail 将其获取回来进行解析,由于发送操作不当,导致了解析就不是那么回事了。
接下来先看看正常的解析过程吧。关于邮件的解析,网上依然有很多例子。
private static void multipartMailParser(Multipart mail) throwsException {int count =mail.getCount();
System.out.println("part count: " +count);for (int i = 0; i < count; i++) {
BodyPart bodyPart=mail.getBodyPart(i);//cid 解析//cid 示例: <4a85b9c9$1$16af704cfc3$Coremail$user_taohan$163.com>
String[] cids = bodyPart.getHeader("Content-Id");
System.out.println("=========> cids: " + (cids == null ? "NULL": cids.length));
String content= "", cid = "";if (cids != null && cids.length > 0) {
content= cids[0];if (content.startsWith("")) {
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());
}else if (bodyPart.isMimeType("text/html")) {
System.out.println("html邮件: " +bodyPart.getContent());
}else if (bodyPart.isMimeType("multipart/*")) {
Multipart part=(Multipart)bodyPart.getContent();
multipartMailParser(part);
}else if (bodyPart.isMimeType("application/octet-stream")) {
String disposition=bodyPart.getDisposition();
System.out.println("任意的二进制数据: " +disposition);//这里就是对附件进行解析
if(disposition.equalsIgnoreCase(BodyPart.ATTACHMENT)) {
String fileName=bodyPart.getFileName();
System.out.println("------------------------保存附件 " +fileName);
InputStream is=bodyPart.getInputStream();
File file= new File("C:\\Users\\AB\\Desktop\\mail\\"+fileName);
copy(is,newFileOutputStream(file));
}
}else if (bodyPart.isMimeType("image/*") && !("".equals(cid))) {//内嵌图片处理
DataHandler dataHandler =bodyPart.getDataHandler();
String name=dataHandler.getName();
System.out.println("内嵌图片 NAME: " +name);
InputStream is=dataHandler.getInputStream();
File file= new File("C:\\Users\\AB\\Desktop\\mail\\"+name);
copy(is,newFileOutputStream(file));
}
}
}private static void copy(InputStream is, OutputStream os) throwsIOException {byte[] bytes = new byte[1024];int len = 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
private List mailAttachmentParts(String accessory) throwsMessagingException, UnsupportedEncodingException {//附件节点集合
List attachments = new ArrayList<>();
MimeBodyPart attachment;
DataHandler dh;
String[] accs= accessory.split(",");for (finalString acc : accs) {
String[] ac= acc.split("-");//按照网上文章的例子,这里只需要进行如下设置即可
attachment = newMimeBodyPart();
dh= new DataHandler(new FileDataSource(ac[1]));
attachment.setDataHandler(dh);
attachments.add(attachment);
}returnattachments;
}
发送后,查看去邮件服务器中查看,邮件是正常的。但是我再通过 JavaMail 获取就出现问题了。输出如下:(//…为我给出的注释)
part count: 5
=========>cids: NULL---multipart/related;
boundary="----=_Part_2_1562389956.1559641692502"part count:2
=========>cids: NULL---text/html; charset=UTF-8
//邮件内容正常获取
html邮件:
这是邮件发送测试十二
这依然是刘亦菲
//内嵌图片也正常获取
=========> cids: 1liuyifei---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邮件:
file upload
//但奇怪的是 Demo.go 这个文件又被正常的当做了附件处理//到这里就大概知道其中的原因了//上面的 图片和html 文件都是比较特殊的, 但是 Demo.go 就不一样了
=========>cids: NULL---application/octet-stream; name=Demo.go
任意的二进制数据: attachment------------------------保存附件 Demo.go
于是,我将需要发送的邮件保存至本地, message.writeTo(new FileOutputStream("D/mail.eml")) 即可;
打开查看其中的内容发现
附件都有如下内容:
Content-Type: image/jpeg; name=lyf.jpg
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=lyf.jpg
—————————————————————
Content-Type: application/octet-stream; name=Demo.go
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=Demo.go
而对比上面获取邮件的输出内容,只有 Demo.go 这一个文件输出了 application/octet-stream 字样, 所以问题就已经变得很明显了。
只需要在创建附件节点时,为附件节点设置以下几样东西即可
attachment.setFileName(MimeUtility.encodeText(dh.getName())); //附件名称
attachment.setDisposition(BodyPart.ATTACHMENT); //设置 disposition 为 attachment (附件标识)
attachment.setHeader("content-disposition", "attachment; filename="+dh.getName()); //设置以下两个 header
attachment.setHeader("content-type", "application/octet-stream; name="+dh.getName());
再看获取邮件输出:
part count: 5
=========>cids: NULL---multipart/related;
boundary="----=_Part_2_1714832523.1559700934372"part count:2
=========>cids: NULL---text/html; charset=UTF-8html邮件:
这是邮件发送测试十四
这依然是刘亦菲
=========> cids: 1liuyifei---cid:liuyifei
image/jpeg; name=lyf2.jpg
内嵌图片 NAME: lyf2.jpg=========>cids: NULL---application/octet-stream; name=zxd.jpg
任意的二进制数据: attachment------------------------保存附件 zxd.jpg=========>cids: NULL---application/octet-stream; name=lyf.jpg
任意的二进制数据: attachment------------------------保存附件 lyf.jpg=========>cids: NULL---application/octet-stream; name=file.html
任意的二进制数据: attachment------------------------保存附件 file.html=========>cids: NULL---application/octet-stream; name=Demo.go
任意的二进制数据: attachment------------------------保存附件 Demo.go
这下就正常了,其实解决办法就是添加上面几样配置即可。
附件中文乱码解决
经过以上处理本以为正常了,但是附件又出现了中文乱码问题,在网上找了很多办法都不行,最终解决办法如下:
中文乱码问题:
网上的办法都是 bodyPart.setFileName(MimeUtility.encodeText(文件名)); 我也试过这种办法,但是未能奏效,最后通过下面的办法解决
//自己模拟一个 MimeUtility.encodeText() 返回的字符串
BASE64Encoder encoder = newBASE64Encoder();
String fileName="=?UTF-8?B?"+encoder.encode(dh.getName().getBytes("UTF-8"))+"?=";
bodyPart.setFileName(fileName);
attachment.setDisposition(BodyPart.ATTACHMENT); //设置 disposition 为 attachment (附件标识)
attachment.setHeader("content-disposition", "attachment; filename="+fileName); //设置以下两个 header, 这里也需要设置 base64 编码的文件名, JavaMail 默认就是使用的Base64编码文件名
attachment.setHeader("content-type", "application/octet-stream; name="+fileName);
获取的时候任然要使用 MimeUtility.decodeText(bodyPart.getFileName()) 对文件名进行解码
中文乱码过长问题:
这个的解决办法和网上方法一样,如下:
static{
System.setProperty("mail.mime.splitlongparameters","false");
}
具体原因自行百度了,多得很。
java 发送邮件 格式_JavaMail发送邮件后再通过JavaMail接收格式问题相关推荐
- java 发送邮件昵称_javaMail发送邮件设置发件人中文昵称
public class TextMessage { //发送信件邮箱的用户名及密码 static String username="272138576"; static Stri ...
- java邮箱格式_JavaMail入门:创建纯文本、HTML格式的邮件
转自:http://haolloyin.blog.51cto.com/1177454/353849/ 在 http://java.sun.com/products/javamail/ 下载了 Java ...
- java案例----用户注册--发送邮件并激活/发送邮件验证码
java案例----用户注册-发送邮件并激活/发送邮件验证码 一.前期准备 1.准备两个邮箱账号(一个发邮件,一个收邮件) 1.1)登录需要发送邮件的QQ邮箱,找到设置项 1.2)然后在账户栏下,找到 ...
- java通过网易邮箱发送邮件
java通过网易邮箱发送邮件 首先申请网易邮箱后开启POP3/SMTP服务,会获得一个授权码 通过hutool工具发送邮件 需要添加的依赖 <dependency><groupId& ...
- 纯Java实现网易邮箱发送邮件
纯Java实现网易邮箱发送邮件 基于Java开发的邮件发送程序.因为使用的是网易的smtp服务器,所以发件人邮箱要求网易邮箱.博主亲测126邮箱和163邮箱有效,yeah邮箱没有测试. 前提准备 需要 ...
- java模拟登录qq邮箱_使用Java实现qq邮箱发送邮件
本文实例为大家分享了Java操作qq邮箱发送邮件的具体代码,供大家参考,具体内容如下 今天尝试了使用QQ邮箱的POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务来进行发送 ...
- 1. 一些截图方法和另存格式的比较(QQ,微信,企业微信,飞书,word,PPT,edge,PrintScreen;svg等);2. 将截图直接转换为PDF并拼接,与插入Word后再转换为PDF的对比
1. 一些截图方法的比较 1.1. 有时候当某个软件没有导出功能,或者导出功能受限,比如 tableau public,但又需要获取展示出的可视化信息时,就需要用到截图.如果这些截图还要用在正式文档中 ...
- 本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。
输入格式: 输入在第一行中以hh:mm:ss的格式给出起始时间,第二行给出整秒数n(<60). 输出格式: 输出在一行中给出hh:mm:ss格式的结果时间. 输入样例: 11:59:40 30 ...
- 时间换算-本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时)。
本题要求编写程序,以hh:mm:ss的格式输出某给定时间再过n秒后的时间值(超过23:59:59就从0点开始计时). 输入格式: 输入在第一行中以hh:mm:ss的格式给出起始时间,第二行给出整秒数n ...
最新文章
- 「NLP」用于序列标注问题的条件随机场
- SAPI(PHP常见的四种运行模式)
- Java是先难后易吗_在解决问题的时候,是先难后易还是先易后难?
- 关于计算机哪些学校好,计算机哪些学校好
- oracle十进制函数语法,Oracle 十进制、二进制互相转换自定义函数
- 使用VisualTreeHelper.GetDrawing(Visual v)枚举所有Visual内容的对象
- 国考计算机专业生报名人数,近四成岗位随便挑!2020年国考,这类专业招录人数接近一万...
- 对象refresh的方法iadodc失败_3个必备cookie实用方法
- FPGA学习笔记06——数电基础知识
- 一个三非渣本的安卓秋招之路
- Java 8 effectively final
- 金融小知识-八行五保-三大综合性金融
- 再谈Qt实现Rasdial拨号问题(说说项目中遇到的问题和解决方案)
- 21种低成本的方式,帮助企业获得关注
- Ceph分布式存储工作原理(Ceph分布式块存储)
- java语言如何求平方根
- PHPstudy的下载与安装。
- 计算机输入法如何显示在桌面快捷方式,在桌面显示/隐藏输入法及输入法热键的设置...
- yilia-puls美化hexo个人博客
- 模拟电话录音系统2.0
热门文章
- CSS实现鼠标上移图片加彩色(滤镜)
- codeforces 1311-c
- access to同义替换_雅思写作同义词替换
- hibernate的 HQL、QBE、QBC
- English_Rhymes_Phonics_resource
- 铺管家教育开店有什么优势
- 联想x3850x6重装系统_联想 System x3850 X6 和x3950 X6 安装与维护指南 PDF
- 【整理】有待完成的题目
- 词云-将豆瓣短评制作成词云
- C语言面向对象编程的类是指,c语言面向对象编程中的类_C ++中的面向对象编程...