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

 更新时间:2016年11月23日 08:48:03   作者:汪先森  
这篇文章主要介绍了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入门第三篇 发送邮件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Spring Data如何简化数据操作的方法

    浅谈Spring Data如何简化数据操作的方法

    这篇文章主要介绍了看Spring Data如何简化数据操作的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • Springmvc异常处理器及拦截器实现代码

    Springmvc异常处理器及拦截器实现代码

    这篇文章主要介绍了Springmvc异常处理器及拦截器实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 如何基于JWT实现接口的授权访问详解

    如何基于JWT实现接口的授权访问详解

    授权是最常见的JWT使用场景,下面这篇文章主要给大家介绍了关于如何基于JWT实现接口的授权访问的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • SpringBoot+Mybatis Plus导致PageHelper失效的解决方法

    SpringBoot+Mybatis Plus导致PageHelper失效的解决方法

    在Springboot项目中使用分页插件的时候,发现PageHelper插件失效了 ,本文主要介绍了SpringBoot+Mybatis Plus导致PageHelper失效的解决方法,感兴趣的可以了解一下
    2024-07-07
  • 你真的了解java单例模式了吗?

    你真的了解java单例模式了吗?

    这篇文章主要介绍了你真的了解java单例模式了吗?实际上单例模式有着好几个变种,并且多线程中涉及到线程安全问题,,需要的朋友可以参考下
    2019-06-06
  • Java实现九九乘法表的小例子

    Java实现九九乘法表的小例子

    九九乘法表一般为三角形,每个数分别和从1到自身的数相乘然后把结果列出来,即要用到两层循环,外层是从1到9for(i=1;i<=9;i++),内层是当前数和从1到自身相乘for(j=1;j<=i;j++)
    2013-09-09
  • Java在算法题中的输入问题实例详解

    Java在算法题中的输入问题实例详解

    在校招笔试中,有的时候我们要自己设计输入输出,所以下面这篇文章主要给大家介绍了关于Java在算法题中的输入问题,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • 在java中使用dom解析xml的示例分析

    在java中使用dom解析xml的示例分析

    本篇文章介绍了,在java中使用dom解析xml的示例分析。需要的朋友参考下
    2013-05-05
  • IDEA版最新MyBatis程序配置教程详解

    IDEA版最新MyBatis程序配置教程详解

    这篇文章主要介绍了IDEA版最新MyBatis程序配置教程详解,需要的朋友可以参考下
    2020-07-07
  • Java多线程并发编程 Volatile关键字

    Java多线程并发编程 Volatile关键字

    volatile 关键字是一个神秘的关键字,也许在 J2EE 上的 JAVA 程序员会了解多一点,但在 Android 上的 JAVA 程序员大多不了解这个关键字。只要稍了解不当就好容易导致一些并发上的错误发生,例如好多人把 volatile 理解成变量的锁
    2017-05-05

最新评论