JavaMail入门第二篇 创建邮件
JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,所以我们需要使用其子类javax.mail.internet.MimeMessage类来创建Message类的实例对象,如果我们创建的是一个简单文本邮件,那么MimeMessage类就可以满足我们的需求了,但是如果需要创建一封包含内嵌资源或者是带附件的复杂邮件,则需要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等类。
1、MimeMessage类表示整封邮件
2、MimeBodyPart类表示邮件的一个MIME消息
3、MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
这三个类的工作关系如下图所示:
虽然应用程序开发者在使用JavaMailAPI创建邮件内容时,通常只需要使用MimeMessage,MimeBodyPart和MimeMultipart这3个主要的类,但是了解他们的类继承关系也是必要的。下图列出了这三个类的继承关系以及常用方法。
下面用javax.mail.internet.MimeMessage类来创建一封简单的文本邮件,
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.FileOutputStream; public class TextMessage {
public static void main(String[] args) throws Exception {
String from = "123456@qq.com";
String to = "123456@163.com";
String subject = "test";
String body = "test!!!"; // 创建Session实例对象
Session session = Session.getDefaultInstance(new Properties());
// 创建MimeMessage实例对象
MimeMessage msg = new MimeMessage(session);
// 设置发件人
msg.setFrom(new InternetAddress(from));
// 设置收件人
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
// 设置发送日期
msg.setSentDate(new Date());
// 设置邮件主题
msg.setSubject(subject);
// 设置纯文本内容的邮件正文
msg.setText(body);
// 保存并生成最终的邮件内容
msg.saveChanges();
// 把MimeMessage对象中的内容写入到文件中
msg.writeTo(new FileOutputStream("c:\\test.eml"));
}
}
我们用邮件客户端(这里用foxmail)打开C盘下面的test.eml文件,可以看到如下信息,说明我们的邮件创建成功。
下面简单解释一下上面出现的一些类
1、MimeMessage类:上面介绍过MimeMessage是Message类的一个具体实现类,用来创建Message类的实例对象,这里构造函数传入了一个Session对象作为参数;
2、Session类:该对象用于收集客户端与邮件服务器之间的网络连接信息和定义整个邮件程序所需的环境信息,这些信息作为Session对象的属性保存在Session对象中,Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息,由于Session类的构造方法是私有的,所以我们使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象;
3、Properties类:该类表示了一个持久的属性集,用于存放相关键值对信息作为参数来创建Session对象,这里构造了一个空的集合作为参数;
4、InternetAddress类:该类是抽象类Address类的一个子类,用来创建一个邮件地址;
5、RecipientType类:该类是Message类的一个内部类,该类有3个静态变量,TO表示收件人,CC表示抄送人(收件人知道抄送的人),BCC表示密送人(收件人不知道密送的人)。
上面的邮件只是包含了简单的文本,有时候我们需要使用HTML文件来丰富我们的邮件正文,例如使用HTML标签来对邮件正文进行排版,使用HTML标签在邮件正文中引入一些图片或者是声音等。下面这段代码创建了一个包含HTML格式的邮件
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.FileOutputStream; public class HtmlMessage {
public static void main(String[] args) throws Exception {
String from = "123456@qq.com";
String to = "123456@163.com";
String subject = "test";
String body = "<h4>欢迎大家阅读此邮件</h4>";
// 创建Session实例对象
Session session = Session.getDefaultInstance(new Properties());
// 创建MimeMessage实例对象
MimeMessage msg = new MimeMessage(session);
// 设置发件人
msg.setFrom(new InternetAddress(from));
// 设置收件人
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
// 设置发送日期
msg.setSentDate(new Date());
// 设置邮件主题
msg.setSubject(subject);
// 设置HTML格式的邮件正文
msg.setContent(body, "text/html;charset=gb2312");
// 保存并生成最终的邮件内容
msg.saveChanges();
// 把MimeMessage对象中的内容写入到文件中
msg.writeTo(new FileOutputStream("c:\\test.eml"));
}
}
我们再用foxmail打开test.eml,显示如下
与之前代码不同的地方只是我们设置邮件内容的时候用setContent方法代替了setText方法,并且指定了邮件正文的MIME类型为text/html。
现在我们学会了创建含有HTML标签的邮件了,不过有时我们可能需要在邮件中插入一些图片来更直观的表达我们的意思,那么这时候我们就需要用到MimeMultipart类与MimeBodyPart类了
import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart; public class PictureMessage {
public static void main(String[] args) throws Exception {
String from = "123456@qq.com";// 发件人地址
String to = "123456@163.com"; // 收件人地址
String subject = "HTML邮件";
String body = "<a href=http://www.cnblogs.com>" + "欢迎大家访问博客园</a></br>"
+ "<img src=\"c:\\dog.jpg\">"; Session session = Session.getDefaultInstance(new Properties());
// 创建MimeMessage对象,并设置各种邮件头字段
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(subject); // 创建一个子类型为"related"的MimeMultipart对象。
MimeMultipart multipart = new MimeMultipart("related"); /*
* 创建一个表示HTML正文的MimeBodyPart对象, 并将它加入到前面创建的MimeMultipart对象中
*/
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html;charset=gb2312");
multipart.addBodyPart(htmlBodyPart); /*
* 创建一个表示图片内容的MimeBodyPart对象, 并将它加入到前面创建的MimeMultipart对象中
*/
MimeBodyPart gifBodyPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource("c:\\dog.jpg");
gifBodyPart.setFileName(fds.getName());
gifBodyPart.setDataHandler(new DataHandler(fds));
multipart.addBodyPart(gifBodyPart); /*
* 将MimeMultipart对象设置为整个邮件的内容, 要注意调用saveChanges方法进行更新
*/
message.setContent(multipart);
message.saveChanges(); // 把MimeMessage对象中的内容写入到文件中
message.writeTo(new FileOutputStream("c:\\PictureMessage.eml"));
}
}
代码看起来似乎有点小复杂,可以再看看上面提到的MimeMessage,MimeMultipart与MimeBodyPart这三个类之间的关系图,这样会更会容易理解上面的代码,我们打开PictureMessage.eml,看到如下信息,说明我们成功的创建了一个带有图片的邮件了,并且该图片以附件的形式包含在邮件中了
MimeMultipart有两种构造函数,
public MimeMultipart()
public MimeMultipart(String subtype)
第一种是无参数的,其默认的实例对象的MIME类型为mixed,第二种制定一个类型来创建MimeMultipart类的实例对象,其有三种常用的类型:mixed,related,alternative,这三种类型在MIME中的组合关系如下所示:
现在我们用上面所示的这种组合关系来创建一封带有附件,并且正文中带有内嵌资源的邮件
import java.io.FileOutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart; public class ComplexMessage {
public static void main(String[] args) throws Exception {
Session session = Session.getDefaultInstance(new Properties());
MimeMessage message = createMessage(session);
message.writeTo(new FileOutputStream("c:\\ComplexMessage.eml"));
} public static MimeMessage createMessage(Session session) throws Exception {
String from = "123456@qq.com";// 发件人地址
String to = "123456@163.com"; // 收件人地址
String subject = "HTML邮件"; // 邮件主题
String body = "<a href=http://www.cnblogs.com>" + "欢迎大家访问博客园</a></br>"
+ "<img src=\"c:\\dog.jpg\">"; MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject(subject); // 创建代表邮件正文和附件的各个MimeBodyPart对象
MimeBodyPart contentPart = createContent(body, "c:\\dog.jpg");
// 下面的附件可以是视频或者是音频
MimeBodyPart attachPart1 = createAttachment("c:\\音乐.MP3");
MimeBodyPart attachPart2 = createAttachment("c:\\视频.avi"); // 创建用于组合邮件正文和附件的MimeMultipart对象
MimeMultipart allMultipart = new MimeMultipart("mixed");
allMultipart.addBodyPart(contentPart);
allMultipart.addBodyPart(attachPart1);
allMultipart.addBodyPart(attachPart2); // 设置整个邮件内容为最终组合出的MimeMultipart对象
message.setContent(allMultipart);
message.saveChanges();
return message;
} public static MimeBodyPart createContent(String body, String filename)
throws Exception {
/*
* 创建代表组合MIME消息的MimeMultipart对象, 和将该MimeMultipart对象保存到的MimeBodyPart对象
*/
MimeBodyPart contentPart = new MimeBodyPart();
MimeMultipart contentMultipart = new MimeMultipart("related"); /*
* 创建用于保存HTML正文的MimeBodyPart对象, 并将它保存到MimeMultipart中
*/
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html;charset=gb2312");
contentMultipart.addBodyPart(htmlBodyPart); /*
* 创建用于保存图片的MimeBodyPart对象, 并将它保存到MimeMultipart中
*/
MimeBodyPart gifBodyPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(filename);
gifBodyPart.setDataHandler(new DataHandler(fds));
contentMultipart.addBodyPart(gifBodyPart); // 将MimeMultipart对象保存到MimeBodyPart对象中
contentPart.setContent(contentMultipart);
return contentPart;
} public static MimeBodyPart createAttachment(String filename)
throws Exception {
// 创建保存附件的MimeBodyPart对象,并加入附件内容和相应信息
MimeBodyPart attachPart = new MimeBodyPart();
FileDataSource fds = new FileDataSource(filename);
attachPart.setDataHandler(new DataHandler(fds));
attachPart.setFileName(fds.getName());
return attachPart;
}
}
打开ComplexMessage.eml文件,可以看到如下内容,
现在我们学会了如何创建一封纯文本的邮件,带有HTML格式的邮件,以及带有内嵌图片与附件的邮件了,下一篇JavaMail入门第三篇 发送邮件将介绍如何发送邮件。
JavaMail入门第二篇 创建邮件的更多相关文章
- JavaMail入门第一篇 邮件简介及API概述
现如今,电子邮件在我们的生活当中扮演着越来越重要的角色,我们每个人几乎都会与其打交道(至少时不时我们都会接收到莫名其妙的垃圾邮件),在工作中,使用邮件进行交流沟通,可以使我们的工作有迹可循,也显的较为 ...
- ElasticSearch入门 第二篇:集群配置
这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- 微信js框架第二篇(创建完整界面布局)
接着昨天的继续谈关于微信新出的这个js框架,今天主要谈一个页面的创建到布局的详细步骤. 一.创建一个完整页面 页面你可以创建在项目的任何节点,只要你在入口文件正确引入创建该页面的路径就可使 ...
- Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界
这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用操心.这太简单了~! 笨木头花心贡献.啥?花心?不呢.是用心~ 转载请注明,原文地址:http://www ...
- Windows下FFmpeg快速入门 <第二篇>
FFmpeg简介 FFmpeg是什么? FFmpeg是用于录制.转换和流化音频和视频的完整解决方案, 包括 libavcodec ,一套领先的音/视频编解码类库.FFmpeg 在Linux上开发,当可 ...
- Android JNI入门第二篇——Java参数类型与本地参数类型对照
前面一篇通过简单的例子介绍了android中JNI的使用.这一篇从基础上了解一些Java参数类型与本地参数类型区别. 1) java中的返回值void和JNI中的void是完全对应的哦! ...
- Hadoop入门第二篇-MapReduce学习
mapreduce是一种计算模型,是google的一篇论文向全世界介绍了MapReduce.MapReduce其实可以可以用多种语言编写Map或Reduce程序,因为hadoop是java写的,所以通 ...
- Html/Css(新手入门第二篇)
一.在实际工作中,都是一个团队在做项目,不是一个人在工作.多人协作,就是每个团队都有自己 的命名习惯.1.css选择符命名,规范.2.都有命名规范文档. 二.css选择符作用:指定css样式所作用对象 ...
- Android Studio开发第二篇创建新项目
创建新项目很简单,File-New-New Project,这个没什么好说的跟Eclipse都差不都. 第二步SDK选择,有手机平板还有Wear,TV,汽车Auto,谷歌眼镜等几个种平台,这里就先选择 ...
随机推荐
- Swift 3 新特性和迁移详解
写在前面 Swift 3.0 正式版发布了差不多快一个月了,断断续续的把手上和 Swift 相关的迁移到了Swift 3.0.所以写点小总结. 背景 代码量(4万行) 首先,我是今年年初才开始入手 S ...
- Spring4 MVC Hibernate4集成
Spring4 MVC Hibernate4集成 一. 本文所用环境 Spring4.0.3.RELEASE Hibernate4.3.5.Final Mysql 二. 工程目录 三. ...
- Android实战技巧:深入解析AsyncTask
AsyncTask的介绍及基本使用方法 关于AsyncTask的介绍和基本使用方法可以参考官方文档和Android实战技巧:多线程AsyncTask这里就不重复. AsyncTask引发的一个问题 上 ...
- 完成端口CreateIoCompletionPort编写高性能的网络模型程序
1.同步网络模型:就是服务端同步阻塞等待客户端的请求,然后继续操作后续处理,缺点是性能低. 2.同步通讯+多线程模型:服务端为每个客户端分配线程,这个线程就负责这个客户端,同步通讯,同步处理这个客户端 ...
- cordova 学习笔记
0.sdk安装 http://spring.io/guides/gs/android/ 1.安装(node.js 需要安装https://nodejs.org/) on OS X and Linux: ...
- SharePoint 2013中修改windows 活动目录(AD)域用户密码的WebPart(免费下载)
前段时间工作很忙,好久没更新博客了,趁国庆休假期间,整理了两个之前积累很实用的企业集成组件,并在真正的大型项目中经受住了考验:.Net版SAP RFC适配器组件和SharePoint 2013修改AD ...
- C#创建windows服务并定时执行
一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Tim ...
- Qt 判断文件是否存在
包含头文件:<QFileInfo> 代码: QFileInfo file("文件路径"); if(file.exists()==false){文件不存在:}
- BW对应后台表[转]
数据源对应后台表 (2012-01-04 20:08:57) 转载▼ 标签: 杂谈 分类: SAP MM Data Sources Tables Purchasing 2LIS_02_SCL EKKO ...
- 导出excel和PDF小结 vba
最近接触了一个关于Access工具的项目,所以整理下需要使用的方法. 功能要求简介: 1.将数据表中的数据导出到excel和PDF 2.并根据某个字段名称分sheet输出. 3.无模板方式 方案简介: ...