第二讲:使用JavaMail表示MIME消息
一、基本原理
javax.mail.Message是一个抽象类,需要使用其子类javax.mail.MimeMessage来创建Message类的实例对象。如果要是仅仅创建包含文本内容的简单邮件只需要使用过MimeMessage类即可。但是要是创建的邮件中内嵌有资源(如图片,超链接,html)或多个附件,则需要同时使用JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等类。
javax.mail.Message是一个抽象类,需要使用其子类javax.mail.MimeMessage来创建Message类的实例对象。如果要是仅仅创建包含文本内容的简单邮件只需要使用过MimeMessage类即可。但是要是创建的邮件中内嵌有资源(如图片,超链接,html)或多个附件,则需要同时使用JavaMail API中的MimeMessage、javax.mail.internet.MimeBodyPart和javax.mail.internet.MimeMultipart等类。
- MimeMessage:表示整封邮件
- MimeBodyPart:表示邮件的一个MIME消息
- MimeMultipart:表示一个由多个MIME消息组合成的组合MIME消息
图1:MIME消息类间的关系(取自《JavaMail开发详解》)
1. 对于复杂的邮件不能简单是使用setText方法生成文本信息,而是要使用一个MimeMultipart对象表示并通过MimeMessage.setContent(Multipart mp)方法设置到MimeMessage对象中。
2. MimeMultipart对象用来组合多个MIME消息,其中的每个MIME消息分别用一个MimeBodyPart对象表示并通过MimeMultipart.addBodyPart(BodyPart bp)方法加入到MimeMultipart对象中。
3. 如果MimeBodyPart对象表示的MIME消息又是一个MIME组合消息,那么它的内容又需要使用一个MimeMultipart对象来表示,并通过MimeBodyPart.setContent(MimeMultipart mp)方法设置到MimeBodyPart对象中。同代表整个邮件的MimeMultipart对象一样,这个MimeMultipart对象中的每一组成单元也分别有一个MimeBodyPart对象表示。
2. MimeMultipart对象用来组合多个MIME消息,其中的每个MIME消息分别用一个MimeBodyPart对象表示并通过MimeMultipart.addBodyPart(BodyPart bp)方法加入到MimeMultipart对象中。
3. 如果MimeBodyPart对象表示的MIME消息又是一个MIME组合消息,那么它的内容又需要使用一个MimeMultipart对象来表示,并通过MimeBodyPart.setContent(MimeMultipart mp)方法设置到MimeBodyPart对象中。同代表整个邮件的MimeMultipart对象一样,这个MimeMultipart对象中的每一组成单元也分别有一个MimeBodyPart对象表示。
下面给出MIME各个类之间的关系图:
图2:JavaMail中定义的MIME类之间的关系
javax.mail.internet.InternetAddress类用于表示电子邮件的地址,邮件中的发件人和收件人地址都是用这个对象表示。
Message.RecipientType表示收件人的类型。它是Message类中的一个静态内部类。
- 有三个常量:TO(表示主要收件人)、CC(邮件的抄送接收者)、BCC(邮件的暗送接收者)
MimeMessage中的函数:
MimeMessage(Session) MimeMessage(Session, InputStream) | Session中包含一系列的键值对,用于设置邮件发送前的信息设置如"mail.smtp.host"表示服务器的主机名。ImputStream 表示邮件的内容将从输入流对象中获取。 |
setFrom() setFrom(Address) | 第一个中的地址将由Session中的"mail.user"属性设置,Address是抽象类通过InternetAddress类实例化 |
setRecipient(Message.RecipientType, Address) setRecipients(Message.RecipientType, Address[]) | 设置接收邮件的用户或一组用户,并且可以指定接收用户的类型TO、CC、BCC |
addRecipient(Message.RecipientType, Address) addRecipients(Message.RecipientType, Address[]) | 增加一个或一组收件人的地址 |
setSendData(java.util.Date data) | 设置邮件发送的日期 |
setSubject(java.lang.String) setSubject(String subject, String charset) | 设置邮件主题并且指定字符集,当MIME使用BASE64或 Quote-Printable编码是需要指定字符集 |
addHeader(String name, String value) setHeader(String name, String value) | 设置消息头字段的名称和消息头字段的值 |
setContent(Object obj, String type) setContent(Multipart mp) | 设置MimeMessage对象的邮件体 |
setText(java.lang.String) | 设置邮件的简单的纯文本内容 |
setFlags(Flags.Flag flag, boolean set ) | 用于设置有的已读标记、删除标记等 |
saveChanges() | 更新并保存MimeMesssage中的 数据,通常是在发送MimeMessage对象封装的消息前调用此函数 |
writeTo(OutputStream os) | 把MimeMessage对象中数据输出到一个RFC822格式的输出流中。第二个参数用于指定输出时应该忽略哪些字段。 |
writeTo(OutputStream os, String[] ignoreList) | |
例一:使用MimeMessage创建存文本邮件
String from = "lucas@sina.com";
String to = "sacul@sohu.com";
String subject = "This is a test!!";
Properties props = new Properties();
Session session = Session.getInstance(props );
Message mailMessage =new MimeMessage(session);
mailMessage.setFrom(new InternetAddress(from));
mailMessage.setRecipient(RecipientType.TO, new InternetAddress(to));
mailMessage.setSubject(subject);
mailMessage.setText("hello, world!");
mailMessage.setSentDate(new Date());
mailMessage.writeTo(new FileOutputStream("D:\\test.eml"));
例二:创建HTML格式的邮件要使用MimeMessage函数中setContent(Object obj, String type)来指定邮件正文的String对象MIME类型为"text/html"
下面的例子中在邮件的这个文中插入一个网络图片
String from = "lucas@sina.com";
String to= "sacul@163.com, chidlk@gmai.com";
String body = "<h4>欢迎大家阅读邮件</h4>" +
"<img src= \"http://c.hiphotos.baidu.com/news/pic/item/a08b87d6277f9e2f11f6d7951d30e924b999f368.jpg\">";
String subject = "Test";
Properties props = new Properties();
Session session = Session.getInstance(props);
Message msg= new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
msg.setRecipients(RecipientType.TO, InternetAddress.parse(to));
msg.setSubject(subject);
msg.setSentDate(new Date());
//设置HTML格式的邮件正文
msg.setContent(body , "text/html;charset=gb2312");
msg.saveChanges();
msg.writeTo(new FileOutputStream("d:\\test.eml"));