最近需要实现一个使用Spring schedule按一定时间间隔自动触发条件发送邮件的功能,在开发的过程中,是按照先测试能发出text/html文本邮件,然后测试添加附件发送邮件,我碰到的问题是,文本邮件能正常发送出来,但是添加附件的邮件却发不出来,这个问题困扰了我很久,所以有必要记录下。
问题点
报错内容:"javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed"
初步解释:是不支持数据类型,没有复合邮件对象的专用信息渠道(MIME type multipart/mixed)”,字面意思是没有发送MIME类型邮件的对象专用信息通道。
报错内容
以下是百度对MIME邮件的解释:
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种
扩展名的
文件用一种
应用程序来打开的方式类型,当该扩展名文件被访问的时候,
浏览器会自动使用指定应用程序来打开。多用于指定一些
客户端自定义的
文件名,以及一些媒体文件打开方式。
它是一个互联网标准,扩展了电子邮件标准,使其能够支持:非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)
问题解决过程
a.发送邮件前可能缺少mime配置代码
CSDN,overstackflow等上有很多帖子,说在使用实例化Transport对象send()方法发送邮件前,需要添加下面这一段代码
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed; x-java-fallback-entry=true"); mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); CommandMap.setDefaultCommandMap(mc); Thread.currentThread().setContextClassLoader( getClass().getClassLoader() );
overstackflow上面对这段代码的解释是:javaMail depends on some configuration files to map MIME types to Java classes (e.g., multipart/mixed
to javax.mail.internet.MimeMultipart
). These configuration files are loaded using the ClassLoader for the application. If the ClassLoader doesn't function properly, these configuration files won't be found中文意思大概是:javaMail发送MIME类型的邮件需要依赖某些配置文件,比如如果使用MimeMultipart需要找到multipart/mixed的对应配置。这些配置文件将会被类装载器加载,如果不能被正常加载,这些配置文件将无法生效。javamail包下有MANFEST文件,里面有一个mailcap或者mailcap.default文件,读取的就是这个文件,发现里面有对邮件格式的要求,如普通html邮件text/html,纯文本邮件text/plain,包含附件的邮件multipart/*等,如下图所示:参考博客:https://stackoverflow.com/questions/21856211/javax-activation-unsupporteddatatypeexception-no-object-dch-for-mime-type-multi?r=SearchResults;结果:添加完成后,依然报错,无效。
b.怀疑mail.jar包和activation.jar包版本问题
由于项目中使用的mail.jar包版本1.4.1,网上建议升级到1.4.7版本或更高的版本尝试解决,由于项目服务器是使用OSGI来建立的,对OSGI几乎不了解,使用常规的方式导入包后发现没有任何效果,项目下只是新多了一个dependency libraries,里面包含自己添加的包,但是这个包里面的资源对于项目好像没有效果,测试依然报错。后面根据帖子又重新build path,将新jar包import然后又export后,还是没有效果。
结果:包更换未成功,对OSGI不了解参考博客:
http://osgi.com.cn/article/7289374;
c.怀疑自己代码本身存在问题
在尝试了以上方法还是没有解决后,参考博客
https://www.cnblogs.com/xdp-gacl/p/4216311.html,使用博客里能发出邮件附件的代码来进行测试。测试时在OSGI服务端项目里新增了一个package,里面写了一个包含main方法的类,直接发送邮件测试,以下是代码
package TestMailSend;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class SendMail {
public static void main(String[] args) throws Exception{
//创建Properties文件
Properties prop=new Properties();
prop.setProperty("mail.host", "mail.boe.com.cn");//主机
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
//使用JavaMail发送邮件的5个step
//step1 创建session
//Session session=Session.getInstance(prop);
Session session1=Session.getDefaultInstance(prop);
//开启session的debug模式,可以看到程序发送email的运行状态
session1.setDebug(true);
//step2 通过session得到transport对象
//Transport trans=session.getTransport();
Transport trans=session1.getTransport();
//step3 使用邮件的用户名和密码连上邮箱服务器,发送邮件时,需要验证发件人的邮箱名和密码正确后才可以发送
trans.connect("mail.boe.com.cn", "发件人邮箱", "发件人邮箱密码");
//step4 创建邮件
//Message message=createSimpleMail(session);//发送纯文本
Message messageAttach=createAttachMail(session1);
//step5 发送邮件
//trans.sendMessage(message, message.getAllRecipients());
trans.sendMessage(messageAttach, messageAttach.getAllRecipients());
trans.close();
}
/**
* 创建一个封只包含文本的邮件
* @param session
* @return
* @throws MessagingException
* @throws AddressException
*/
public static MimeMessage createSimpleMail(Session session) throws AddressException, MessagingException{
//创建邮箱对象
MimeMessage message=new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("发件人邮箱"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人邮箱"));
//邮件的标题
message.setSubject("只包含文本的简单邮件");
//邮件的文本内容
message.setContent("这是一封测试邮件!","text/html;charset=utf-8");
//返回创建好的邮件对象
return message;
}
/**
* 创建一封包含附件的邮件
* @param session
* @return
* @throws MessagingException
* @throws AddressException
* @throws IOException
* @throws FileNotFoundException
*/
public static MimeMessage createAttachMail(Session session) throws AddressException, MessagingException, FileNotFoundException, IOException{
//创建邮件
MimeMessage message=new MimeMessage(session);
//指明邮件发件人
message.setFrom(new InternetAddress("发件人邮箱"));
//指明邮件收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人邮箱"));
//邮件标题
message.setSubject("这是一封包含附件的邮件");
//创建邮件正文,为了避免邮件正文中文乱码,使用utf-8
MimeBodyPart text=new MimeBodyPart();
text.setContent("使用JavaMail创建的包含附件的邮件","application/x-xls;charset=utf-8");
//创建附件邮件
MimeBodyPart attachment=new MimeBodyPart();
DataHandler dh=new DataHandler(new FileDataSource("C:\\测试Excel.xls"));
attachment.setDataHandler(dh);
attachment.setFileName(dh.getName());
//创建容器描述数据关系
MimeMultipart mmp=new MimeMultipart();
mmp.addBodyPart(text);
mmp.addBodyPart(attachment);
mmp.setSubType("mixed");
message.setContent(mmp);
message.saveChanges();
//存盘
message.writeTo(new FileOutputStream("C:\\attachmentEmail.eml"));
//返回生成的邮件
return message;
}
}
结果:将这部分代码执行,发现能正常发出包含附件的邮件,然后将同样的代码放到OSGI服务器下运行,发现还是发不出来。通过以上发现,邮件发不出附件排除了jar包版本的问题,也可排除了代码本身的问题(前面测试过了没有问题),然后怀疑到了OSGI服务器设置的问题,查询overstackflow上也有一个人跟我情况类似,参考博客:https://stackoverflow.com/questions/8923324/java-throws-an-unsupporteddatatypeexception-when-running-osgi-with-javax-mail?r=SearchResults,但是依然没有找到解决办法。
d.尝试将mail包通过MANIFEST添加到class path里
最后通过MANIFEST,在runtime下添加了class path,将mail.jar包添加到类路径,重新测试竟然OK了!
runtime下添加mail.jar类路径。
Classpath下面有一段介绍:
Specify the libraries and folders that constitute the plug-in classpath. If unspecified, the classes and resources are assumed to be at the root of the plug-in.
英语蹩脚,大概意思就是,指定组成plug-in 类路径下的文件夹,如本项目文件夹为lib。如果不指定,资源类可能还在plug-in的根目录,这样配置后,MANIFEST.MF里在Bundle-Class下面新增lib/mail.jar 。
然后在build.properties下发现自动新增lib/mail.jar。
aaarticlea/png;base64,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" alt="" />
网上有一篇帖子有大概的说明MANIFEST.MF配置,里面有一段话: .”指程序运行目录,即导出的JAR 包所在目录。程序运行时依据Class-Path 项的设置路径来查找支持库。每一个支持库之间用空格隔开。
结论
将mail.jar包在MANIFEST文件下,通过runtime导入包的类路径后,重新发送添加附件的邮件能成功。
总结
Javamail发送有附件的邮件功能不是很熟悉,走了很多弯路,小小的记录一下,有些不需要的步骤没有写。另外如果想对发送邮件过程有详细的了解,可以学习segmentfault上面的一篇博文:https://segmentfault.com/a/1190000008030346
- 发送邮件报错javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/mixed
关于使用javaMail发送邮件报错:javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multip ...
- 控制台出现“The script has an unsupported MIME type ('text/html')”报错
有时候开发React或者Vue项目时,本地运行访问时,会莫名出现报错如下: The script has an unsupported MIME type ('text/html') 这是由于无意中开 ...
- Chrome 报 Resource interpreted as Script but transferred with MIME type text/plain 警告的解决办法
http://www.2cto.com/os/201312/262437.html 安装了VS2012之后,chrome在加载页面的时候会报 Resource interpreted as Scrip ...
- 报错解决——OSError: libdarknet.so: cannot open shared object file: No such file or directory
在python目录下打开终端,输入 python darknet.py 结果报错 Traceback (most recent call last): File “darknet.py”, line ...
- Python使用suds调用webservice报错解决方法:AttributeError: 'Document' object has no attribute 'set'
使用python的suds包调用webservice服务接口,报错:AttributeError: 'Document' object has no attribute 'set' 调用服务接口代码: ...
- Can't pickle local object '_createenviron.<locals>.encodekey'报错解决
关于selenium传参报错问题,用下面是报错信息: Traceback (most recent call last): File "D:/code/read_book/main.py&q ...
- HTTP 错误 404.3 - Not Found 由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本 ,请添加处理程序。如果下载文件,请添加 MIME 映射。 IIS站点中添加WCF项目后浏览网站报错解决方法。
vs2013 wcf服务 windows10 家庭中文版 上图中的红色没有出现就按照下面的方法做: 按照上图所示勾选. 刷新上图中你的网站,查看上图右边的内容是否出现,如果出现,再次重新浏览网站,看一 ...
- 解决liblapack.so.3: cannot open shared object file: No such file or directory报错
关于这种类型的报错通常的解决方式有两个: 方法一.查找系统哪儿有liblapack.so.3这个文件 find /lib -name liblapack.so.3 如果lib找不到这个文件,请换其他路 ...
- 【TensorFlow】使用Object Detection API 训练自己的数据集报错
错误1: 训练正常开始后,能正常看到日志输出,但中途报错 ResourceExhaustedError (see above for traceback): OOM when allocating ...
随机推荐
- 'git status'不显示untracked files
git status -uno git status --untracked-files=no
- Java URLEncoder URLDecoder
URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换 URLDecoder类包含一 ...
- GIFDecoder源码分析
源码见:ddxxll2008/gifdecoder_java run() public void run(){ if(in != null){ readStream(); }else if(gifDa ...
- jgGrid pivot reload重新加载及刷新数据
1.当使用jqGrid进行多维表时,reload方法会不停的重复增加标题的行数. 解决办法:直接删除jqGrid,重新初始化页面. function query(){//crossTable pivo ...
- Oracle掌管权限和角色
转自:https://blog.csdn.net/without_bont/article/details/79862112 掌管权限和角色 这一部分我们主要看oracle中如何管理权限和角色,权限和 ...
- Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?
Spring中的@Transactional 放在类级别 和 方法级别 上有什么不同? @Transactional放在类级别上是否等同于该类的每个方法都放上了@Transactional? 是的一般 ...
- HTTP、TCP、IP协议常见面试题
前言:在看面试题之前,先了解一下基本定义. HTTP.TCP.IP协议基本定义 HTTP: (HyperText Transport Protocol)是超文本传输协议的缩写,它用于传送WWW方式的数 ...
- Array.Resize(ref arry, size);
数组原来的内容不变,后面添加新的空间. 内部操作应该是:重新分配了一块空间,然后将旧的内容拷过去
- ReactiveX 学习笔记(4)过滤数据流
Filtering Observables 本文主题为过滤 Observable 的操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(三)Filtering Deb ...
- Shell编程常用函数
1.打印提示消息函数,不同级别消息使用不同的颜色显示.其中错误信息提示为红色字体. # -------------------------------------------------------- ...