javaMail实现收发邮件(二)
JavaMail API常用类
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个主要的类,但是了解他们的类继承关系也是必要的。下图列出了这三个类的继承关系以及常用方法。

创建邮件
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"));
}
}
TextMessage
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表示密送人(收件人不知道密送的人)。
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"));
}
}
HtmlMessage
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"));
}
}
PictureMessage
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
javaMail实现收发邮件(二)的更多相关文章
- javaMail实现收发邮件(四)
JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操作,在介绍这些类之前,我们先来了解下邮件接收API的体系结构,JavaMai API中定义了一个java.mail.Store类 ...
- javaMail实现收发邮件(三)
JavaMail API中定义了一个java.mail.Transport类,它专门用于执行邮件发送任务,这个类的实例对象封装了某种邮件发送协议的底层实施细节,应用程序调用这个类中的方法就可以把Mes ...
- javaMail实现收发邮件(一)
电子邮件的传输过程 电子邮件系统采用客户/服务器模式.电子邮件传送需要用到以下3个重要模块:MUA(Mail User Agent,邮件用户代理):用户通过它与电子邮件服务器打交道.MUA实际上就是邮 ...
- javaMail实现收发邮件(五)
控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格式.规范复杂得很.不过,我们所用的浏览器内置了解析各种数据类型的数据处理模块,我们只需要在把数据流传输给浏 ...
- java中javamail收发邮件实现方法
概述 1.邮件相关的标准 厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol) :即简单邮 ...
- JavaMail实现带附件的收发邮件
一.前言 参考博客: http://blog.csdn.net/xietansheng/article/details/51722660 http://www.cnblogs.com/HigginCu ...
- JavaMail(二):利用JavaMail发送复杂邮件
上一篇文章我们学习了利用JavaMail发送简单邮件,这篇文章我们利用JavaMail发送稍微复杂一点的邮件(包含文本.图片.附件).这里只贴出核心代码,其余代码可参考JavaMail(一):利用Ja ...
- 用 Apache James 搭建邮件服务器来收发邮件实践(一)(转)
Apache James 简称 James, 是 Java Apache Mail Enterprise Server的缩写.James 是100%基于Java的电子邮件服务器.它是一种独立的邮件服务 ...
- 使用python的email、smtplib、poplib模块收发邮件
使用python的email.smtplib.poplib模块收发邮件 一封电子邮件的旅程是: MUA:Mail User Agent——邮件用户代理.(即类似Outlook的电子邮件软件) MTA: ...
随机推荐
- 20155219 第十周课下作业-IPC
题目:研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 1.共享内存 共享内存就是允许两个不相关的进程访问同一个逻辑内存. ...
- Go语言for循环语句
for循环语句解释与使用 首先我们定义sum:=0 格式:for i:=1;i<=100;i++{ sum+=i } for 循环100次,首先执行i=1,然后判断i<100,再执行sum ...
- 10.python面向对象进阶功能
isinstance(obj,cls)和issubclass(sub,super)(1)isinstance(obj,cls)检查一个对象obj是否是一个类cls的实例(2)issubclass(su ...
- linux ---> taskkill pid 8080 /f
★ :--linux->-端口占用 : netstat -anonetstat -ano|findstr 8003taskkill /pid 4816 /f
- JavaScript 堆排序详解
堆通常实现为全完二叉树,二叉堆一般分为两种:最大堆和最小堆.堆排序就是通过将数组转换成最大堆结构再进行排序. // 原理:把数组转换成最大堆来排序.把堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次 ...
- pxe+Kickstart自动装机补充知识点
1.vmlinuzvmlinuz是可引导的.压缩的内核.“vm”代表“Virtual Memory”.Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制.Linux能够使用硬盘 ...
- 论文阅读笔记:【MDNet】
[MDNET]: H Nam, B Han. Learning multi-domain convolutional neural networks for visual tracking[C]. / ...
- Delphi XE4 For IOS之部署问题
在XE4中编写完程序后,怎么把相应的文件部署到ios虚拟机和真实机子中呢?下面就来说说. 首先选择你要部署的项目,选择Project->Deployment菜单 Deployment菜单打开如下 ...
- nginx http转 https
场景 项目前期使用http,后期为了安全方面的考虑,启用了https.项目架构:前端使用nginx作为多个tomcat实例的反向代理和负载均衡.实际上只需要在nginx上启用https即可,使客户端与 ...
- Make a plan, and stand for it!
我发现博主本人善于事前做计划,事后做总结.但是不善于坚持自己的计划.就拿10.1这个假期来讲,放假前看多许多的攻略,计划了很多条的自驾出行的路线,但是好像一条也没坚持,最后选择了一条临时的线路,而且临 ...