JavaMail API使用javax.mail.Message类来表示一封邮件,Message类是一个抽象类,因此咱们须要使用其子类javax.mail.internet.MimeMessage类来建立Message类的实例对象,若是咱们建立的是一个简单文本邮件,那么MimeMessage类就能够知足咱们的需求了,可是若是须要建立一封包含内嵌资源或者是带附件的复杂邮件,则须要使用到JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等类。html
一、MimeMessage类表示整封邮件java
二、MimeBodyPart类表示邮件的一个MIME消息服务器
三、MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。网络
这三个类的工做关系以下图所示:session
虽然应用程序开发者在使用JavaMailAPI建立邮件内容时,一般只须要使用MimeMessage,MimeBodyPart和MimeMultipart这3个主要的类,可是了解他们的类继承关系也是必要的。下图列出了这三个类的继承关系以及经常使用方法。函数
下面用javax.mail.internet.MimeMessage类来建立一封简单的文本邮件,post
1 import java.util.Date; 2 import java.util.Properties; 3 import javax.mail.Message; 4 import javax.mail.Session; 5 import javax.mail.internet.InternetAddress; 6 import javax.mail.internet.MimeMessage; 7 import java.io.FileOutputStream; 8 9 public class TextMessage { 10 public static void main(String[] args) throws Exception { 11 String from = "123456@qq.com"; 12 String to = "123456@163.com"; 13 String subject = "test"; 14 String body = "test!!!"; 15 16 // 建立Session实例对象 17 Session session = Session.getDefaultInstance(new Properties()); 18 // 建立MimeMessage实例对象 19 MimeMessage msg = new MimeMessage(session); 20 // 设置发件人 21 msg.setFrom(new InternetAddress(from)); 22 // 设置收件人 23 msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); 24 // 设置发送日期 25 msg.setSentDate(new Date()); 26 // 设置邮件主题 27 msg.setSubject(subject); 28 // 设置纯文本内容的邮件正文 29 msg.setText(body); 30 // 保存并生成最终的邮件内容 31 msg.saveChanges(); 32 // 把MimeMessage对象中的内容写入到文件中 33 msg.writeTo(new FileOutputStream("c:\\test.eml")); 34 } 35 }
咱们用邮件客户端(这里用foxmail)打开C盘下面的test.eml文件,能够看到以下信息,说明咱们的邮件建立成功。url
下面简单解释一下上面出现的一些类spa
一、MimeMessage类:上面介绍过MimeMessage是Message类的一个具体实现类,用来建立Message类的实例对象,这里构造函数传入了一个Session对象做为参数;code
二、Session类:该对象用于收集客户端与邮件服务器之间的网络链接信息和定义整个邮件程序所需的环境信息,这些信息做为Session对象的属性保存在Session对象中,Session对象利用了java.util.Properties对象得到了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息,因为Session类的构造方法是私有的,因此咱们使用Session类提供的getDefaultInstance()这个静态工厂方法得到一个默认的Session对象;
三、Properties类:该类表示了一个持久的属性集,用于存放相关键值对信息做为参数来建立Session对象,这里构造了一个空的集合做为参数;
四、InternetAddress类:该类是抽象类Address类的一个子类,用来建立一个邮件地址;
五、RecipientType类:该类是Message类的一个内部类,该类有3个静态变量,TO表示收件人,CC表示抄送人(收件人知道抄送的人),BCC表示密送人(收件人不知道密送的人)。
上面的邮件只是包含了简单的文本,有时候咱们须要使用HTML文件来丰富咱们的邮件正文,例如使用HTML标签来对邮件正文进行排版,使用HTML标签在邮件正文中引入一些图片或者是声音等。下面这段代码建立了一个包含HTML格式的邮件
1 import java.util.Date; 2 import java.util.Properties; 3 import javax.mail.Message; 4 import javax.mail.Session; 5 import javax.mail.internet.InternetAddress; 6 import javax.mail.internet.MimeMessage; 7 import java.io.FileOutputStream; 8 9 public class HtmlMessage { 10 public static void main(String[] args) throws Exception { 11 String from = "123456@qq.com"; 12 String to = "123456@163.com"; 13 String subject = "test"; 14 String body = "<h4>欢迎你们阅读此邮件</h4>"; 15 // 建立Session实例对象 16 Session session = Session.getDefaultInstance(new Properties()); 17 // 建立MimeMessage实例对象 18 MimeMessage msg = new MimeMessage(session); 19 // 设置发件人 20 msg.setFrom(new InternetAddress(from)); 21 // 设置收件人 22 msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); 23 // 设置发送日期 24 msg.setSentDate(new Date()); 25 // 设置邮件主题 26 msg.setSubject(subject); 27 // 设置HTML格式的邮件正文 28 msg.setContent(body, "text/html;charset=gb2312"); 29 // 保存并生成最终的邮件内容 30 msg.saveChanges(); 31 // 把MimeMessage对象中的内容写入到文件中 32 msg.writeTo(new FileOutputStream("c:\\test.eml")); 33 } 34 }
咱们再用foxmail打开test.eml,显示以下
与以前代码不一样的地方只是咱们设置邮件内容的时候用setContent方法代替了setText方法,而且指定了邮件正文的MIME类型为text/html。
如今咱们学会了建立含有HTML标签的邮件了,不过有时咱们可能须要在邮件中插入一些图片来更直观的表达咱们的意思,那么这时候咱们就须要用到MimeMultipart类与MimeBodyPart类了
1 import java.io.FileOutputStream; 2 import java.util.Properties; 3 import javax.activation.DataHandler; 4 import javax.activation.FileDataSource; 5 import javax.mail.Message; 6 import javax.mail.Session; 7 import javax.mail.internet.InternetAddress; 8 import javax.mail.internet.MimeBodyPart; 9 import javax.mail.internet.MimeMessage; 10 import javax.mail.internet.MimeMultipart; 11 12 public class PictureMessage { 13 public static void main(String[] args) throws Exception { 14 String from = "123456@qq.com";// 发件人地址 15 String to = "123456@163.com"; // 收件人地址 16 String subject = "HTML邮件"; 17 String body = "<a href=http://www.cnblogs.com>" + "欢迎你们访问博客园</a></br>" 18 + "<img src=\"c:\\dog.jpg\">"; 19 20 Session session = Session.getDefaultInstance(new Properties()); 21 // 建立MimeMessage对象,并设置各类邮件头字段 22 MimeMessage message = new MimeMessage(session); 23 message.setFrom(new InternetAddress(from)); 24 message.setRecipients(Message.RecipientType.TO, 25 InternetAddress.parse(to)); 26 message.setSubject(subject); 27 28 // 建立一个子类型为"related"的MimeMultipart对象。 29 MimeMultipart multipart = new MimeMultipart("related"); 30 31 /* 32 * 建立一个表示HTML正文的MimeBodyPart对象, 并将它加入到前面建立的MimeMultipart对象中 33 */ 34 MimeBodyPart htmlBodyPart = new MimeBodyPart(); 35 htmlBodyPart.setContent(body, "text/html;charset=gb2312"); 36 multipart.addBodyPart(htmlBodyPart); 37 38 /* 39 * 建立一个表示图片内容的MimeBodyPart对象, 并将它加入到前面建立的MimeMultipart对象中 40 */ 41 MimeBodyPart gifBodyPart = new MimeBodyPart(); 42 FileDataSource fds = new FileDataSource("c:\\dog.jpg"); 43 gifBodyPart.setFileName(fds.getName()); 44 gifBodyPart.setDataHandler(new DataHandler(fds)); 45 multipart.addBodyPart(gifBodyPart); 46 47 /* 48 * 将MimeMultipart对象设置为整个邮件的内容, 要注意调用saveChanges方法进行更新 49 */ 50 message.setContent(multipart); 51 message.saveChanges(); 52 53 // 把MimeMessage对象中的内容写入到文件中 54 message.writeTo(new FileOutputStream("c:\\PictureMessage.eml")); 55 } 56 }
代码看起来彷佛有点小复杂,能够再看看上面提到的MimeMessage,MimeMultipart与MimeBodyPart这三个类之间的关系图,这样会更会容易理解上面的代码,咱们打开PictureMessage.eml,看到以下信息,说明咱们成功的建立了一个带有图片的邮件了,而且该图片以附件的形式包含在邮件中了
MimeMultipart有两种构造函数,
1 public MimeMultipart() 2 public MimeMultipart(String subtype)
第一种是无参数的,其默认的实例对象的MIME类型为mixed,第二种制定一个类型来建立MimeMultipart类的实例对象,其有三种经常使用的类型:mixed,related,alternative,这三种类型在MIME中的组合关系以下所示:
如今咱们用上面所示的这种组合关系来建立一封带有附件,而且正文中带有内嵌资源的邮件
1 import java.io.FileOutputStream; 2 import java.util.Properties; 3 import javax.activation.DataHandler; 4 import javax.activation.FileDataSource; 5 import javax.mail.Message; 6 import javax.mail.Session; 7 import javax.mail.internet.InternetAddress; 8 import javax.mail.internet.MimeBodyPart; 9 import javax.mail.internet.MimeMessage; 10 import javax.mail.internet.MimeMultipart; 11 12 public class ComplexMessage { 13 public static void main(String[] args) throws Exception { 14 Session session = Session.getDefaultInstance(new Properties()); 15 MimeMessage message = createMessage(session); 16 message.writeTo(new FileOutputStream("c:\\ComplexMessage.eml")); 17 } 18 19 public static MimeMessage createMessage(Session session) throws Exception { 20 String from = "123456@qq.com";// 发件人地址 21 String to = "123456@163.com"; // 收件人地址 22 String subject = "HTML邮件"; // 邮件主题 23 String body = "<a href=http://www.cnblogs.com>" + "欢迎你们访问博客园</a></br>" 24 + "<img src=\"c:\\dog.jpg\">"; 25 26 MimeMessage message = new MimeMessage(session); 27 message.setFrom(new InternetAddress(from)); 28 message.setRecipients(Message.RecipientType.TO, 29 InternetAddress.parse(to)); 30 message.setSubject(subject); 31 32 // 建立表明邮件正文和附件的各个MimeBodyPart对象 33 MimeBodyPart contentPart = createContent(body, "c:\\dog.jpg"); 34 // 下面的附件能够是视频或者是音频 35 MimeBodyPart attachPart1 = createAttachment("c:\\音乐.MP3"); 36 MimeBodyPart attachPart2 = createAttachment("c:\\视频.avi"); 37 38 // 建立用于组合邮件正文和附件的MimeMultipart对象 39 MimeMultipart allMultipart = new MimeMultipart("mixed"); 40 allMultipart.addBodyPart(contentPart); 41 allMultipart.addBodyPart(attachPart1); 42 allMultipart.addBodyPart(attachPart2); 43 44 // 设置整个邮件内容为最终组合出的MimeMultipart对象 45 message.setContent(allMultipart); 46 message.saveChanges(); 47 return message; 48 } 49 50 public static MimeBodyPart createContent(String body, String filename) 51 throws Exception { 52 /* 53 * 建立表明组合MIME消息的MimeMultipart对象, 和将该MimeMultipart对象保存到的MimeBodyPart对象 54 */ 55 MimeBodyPart contentPart = new MimeBodyPart(); 56 MimeMultipart contentMultipart = new MimeMultipart("related"); 57 58 /* 59 * 建立用于保存HTML正文的MimeBodyPart对象, 并将它保存到MimeMultipart中 60 */ 61 MimeBodyPart htmlBodyPart = new MimeBodyPart(); 62 htmlBodyPart.setContent(body, "text/html;charset=gb2312"); 63 contentMultipart.addBodyPart(htmlBodyPart); 64 65 /* 66 * 建立用于保存图片的MimeBodyPart对象, 并将它保存到MimeMultipart中 67 */ 68 MimeBodyPart gifBodyPart = new MimeBodyPart(); 69 FileDataSource fds = new FileDataSource(filename); 70 gifBodyPart.setDataHandler(new DataHandler(fds)); 71 contentMultipart.addBodyPart(gifBodyPart); 72 73 // 将MimeMultipart对象保存到MimeBodyPart对象中 74 contentPart.setContent(contentMultipart); 75 return contentPart; 76 } 77 78 public static MimeBodyPart createAttachment(String filename) 79 throws Exception { 80 // 建立保存附件的MimeBodyPart对象,并加入附件内容和相应信息 81 MimeBodyPart attachPart = new MimeBodyPart(); 82 FileDataSource fds = new FileDataSource(filename); 83 attachPart.setDataHandler(new DataHandler(fds)); 84 attachPart.setFileName(fds.getName()); 85 return attachPart; 86 } 87 }
打开ComplexMessage.eml文件,能够看到以下内容,
如今咱们学会了如何建立一封纯文本的邮件,带有HTML格式的邮件,以及带有内嵌图片与附件的邮件了,下一篇JavaMail入门第三篇 发送邮件将介绍如何发送邮件。