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: ...
随机推荐
- .net4.0调用非托管DLL的异常捕获
转发: 由于有些非托管的DLL内部异常未有效处理,当托管程序调用到这样的DLL时,就引起托管程序意外退出. 托管程序使用通常的捕获try……catch块不起作用.原因是.NET 4.0里新的异常处理机 ...
- python 的排名,已经python的简单介绍
我在今天看了一篇文章,是简书的全网程序猿写的,Java已经退出神坛,python稳居第一. python是由龟叔写的,它在英文的意思是蟒蛇. 根据编程语言流行指数排行榜2019年2月的榜单 据了解,目 ...
- 巡风安装配置 -windows
巡风是一款适用于企业内网的漏洞快速应急.巡航扫描系统,通过搜索功能可清晰的了解内部网络资产分布情况,并且可指定漏洞插件对搜索结果进行快速漏洞检测并输出结果报表. 其主体分为两部分:网络资产识别引擎,漏 ...
- 20165308实验三 敏捷开发与XP实践实验报告
实验三 敏捷开发与XP实践实验报告 实验目的 安装 alibaba 插件,解决代码中的规范问题.再研究一下Code菜单,找出一项让自己感觉最好用的功能. 在码云上把自己的学习搭档加入自己的项目中,确认 ...
- python3.6 内置函数
python内置函数 # encoding: utf-8 # module builtins # from (built-in) # by generator 1.145 ""&q ...
- WIN7 WIN10赋予文件或者文件夹完全访问权限
WIN7 WIN10赋予文件或者文件夹完全访问权限win7文件夹图标中多了一把小锁打不开文件夹怎么办?解决办法一:右击目录→取得管理员权限!该方法适用于win7旗舰版.解决办法二:添加everyone ...
- 前端-JavaScript1-4——JavaScript之变量
变量(Variables),和高中代数学习的x.y.z很像,它们不是字母,而是蕴含值的符号. 它和直接量不同,直接量5,就是数字5:直接量”你好”就是字符串“你好”.现在这个变量不一样了,你看见一个a ...
- ylbtech-协议-网络-安全协议:HTTPS
ylbtech-协议-网络-安全协议:HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer 或 Hypertext ...
- 静态初始化块和main方法哪个先被执行?
直接看代码 public class BlockAndMain { public static void main(String[] args) { System.out.println(" ...
- Group Pathfinding & Movement in RTS Style Games
转自:http://gamasutra.com/blogs/AndrewErridge/20180522/318413/Group_Pathfinding__Movement_in_RTS_Style ...