JavaMail入门教程之创建邮件(2)_java

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
创建邮件
java mail 发送邮件、javamail接收邮件、javamail发送html邮件、javamail发送qq邮件、javamail收取邮件,以便于您获取更多的相关知识。

时间: 2024-09-17 23:20:40

JavaMail入门教程之创建邮件(2)_java的相关文章

JavaMail入门教程之发送邮件(3)_java

JavaMail API中定义了一个java.mail.Transport类,它专门用于执行邮件发送任务,这个类的实例对象封装了某种邮件发送协议的底层实施细节,应用程序调用这个类中的方法就可以把Message对象中封装的邮件数据发送到指定的SMTP服务器.使用JavaMail发送邮件时设计到的主要API之间的工作关系如下所示: 1.从Session对象中获得实现了某种邮件发送协议的Transport对象: 2.使用Session对象创建Message对象,并调用Message对象的方法封装邮件数

SharePoint 2013 入门教程之创建及修改母版页

原文:SharePoint 2013 入门教程之创建及修改母版页 在SharePoint 2013中,微软提供了根据HTML页面转换Master页的方法,并支持单项同步,但是这样的更新,并不完善,会使一些功能造成丢失,所以,了解Master结构的人,尽量直接去修改Master比较方便. 当然,如果需要使用母版页,必须开启SharePoint 2013的发布功能,也就是去网站集功能和网站功能,打开激活发布的Feature. 1.激活发布功能 2.打开SharePoint Designer 2013

ActiveReports 报表控件官方中文入门教程 (2)-创建、数据源、浏览以及发布

原文:ActiveReports 报表控件官方中文入门教程 (2)-创建.数据源.浏览以及发布 本篇文章将阐述首次使用 ActiveReports 报表控件 的方法,包括添加报表文件.绑定数据源以及如何发布报表等内容. ActiveReports 报表控件官方中文入门教程 (1)-安装.激活以及产品资源 ActiveReports 报表控件官方中文入门教程 (3)-如何选择页面报表和区域报表 主要内容包括: 新建工程 在工程中添加ActiveReports报表文件 添加报表数据源 浏览报表 发布

SharePoint 2013 入门教程之创建页面布局及页面

原文:SharePoint 2013 入门教程之创建页面布局及页面 在SharePoint的使用过程中,页面布局和页面时很重要的两个概念,主要用于数据个性化展示,下面,我们简单介绍一下SharePoint的页面布局和页面的个性化. 一. SharePoint页面模型概述 如下图,是SharePoint页面模型图,我们可以看出母版页.页面布局.页面之间的关系,母版页一般是规范Web站点的Head部分和Foot部分,而页面布局和页面主要是中间的页面问题. 页面布局的作用,是为了统一一个类型的页面的格

sql入门教程:sql 创建表create table 与数据库[create databse]

sql入门教程:sql 创建表create table 与数据库[create databse] 在创建数据库的声明 在CREATE DATABASE语句是用来建立一个数据库. 创建数据库的SQL语法 CREATE DATABASE database_name 创建数据库的例子现在,我们要建立一个数据库,所谓的" my_db " . 我们使用下面的CREATE DATABASE语句:CREATE DATABASE my_db   下面来看看sql 创建表create table 在创建

Android入门教程之创建样式与主题_Android

一.前言 作为一个安卓开发者,我们一般把焦点放在app的功能上.但是仅仅有功能是不够的,界面和功能一样重要.有两种方法可以改变app的外观.第一种就是直接在xml中直接修改View的属性.这种方法只适合于只有几个View和Activity的简单app.第二种方法就是创建自定义的样式和主题.如果你对web开发熟悉,第一种方法类似于使用内联的CSS样式,而第二种类似于使用style sheets. 这篇文章我们将介绍如何创建自定义的样式和主题. 二.创建Styles 样式显然是应用到UI控件上面的.

PowerShell入门教程之创建和使用配置文件实例_PowerShell

在命令行中定义别名.变量和函数,只是将它们添加在当前PowerShell的会话中.退出会话后,这些更改就会丢失.想要在以后的会话中也能使用它们,就要将它们定义在配置文件中. 配置文件 PowerShell的配置文件,不像Windows操作系统中那样使用.ini文件,也不像多数应用程序那样使用XML文件.PowerShell的配置文件都是些普通的PowerShell脚本文件.需要注意的是,这些配置文件的文件名是固定.不能更改的.并且它们受到脚本执行策略的约束,就是说在默认情况下,也就是脚本执行策略

THREE.JS入门教程(4)创建粒子系统_基础知识

译序 Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D.但是目前这项技术还处在发展阶段,资料极为匮乏,爱好者学习基本要通过Demo源码和Three.js本身的源码来学习. 0.简介 嗨,又见面了.这么说我们已经开始学习Three.js了,如果你还没有看过之前三篇教程,建议你先读完.如果你已经读完前面的教程了,你可能会想做一些关于粒子的东西.让我们直面这个话题吧,每个人都爱粒子效果.不管你是否知道,你可以很轻易地创建它们. 1

THREE.JS入门教程(6)创建自己的全景图实现步骤_基础知识

译序 Three.js是一个伟大的开源WebGL库,WebGL允许JavaScript操作GPU,在浏览器端实现真正意义的3D.但是目前这项技术还处在发展阶段,资料极为匮乏,爱好者学习基本要通过Demo源码和Three.js本身的源码来学习. 0.简介 全景图非常酷.使用Three.js做一个属于自己的全景图并不是那么困难. 要做一个全景图,你需要一个软件用来做一张全景图片(译者注:如果你没有那些特殊的设备).我使用了iPhone上的Microsoft Photosynth软件来制作. 1.环境