第二讲:使用JavaMail表示MIME消息


一、基本原理
    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消息

三者之间的关系如图所示:


java mail 正文怎么设置样式 javax.mail.internet.mimemu_java mail 正文怎么设置样式


图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对象表示。


下面给出MIME各个类之间的关系图:


java mail 正文怎么设置样式 javax.mail.internet.mimemu_sun公司_02


图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"));