第二講:使用JavaMail表示MIME消息(1)

第二講:使用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消息
三者之間的關係如圖所示:

圖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各個類之間的關係圖:

圖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 = "[email protected]";
		String to = "[email protected]";
		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 = "[email protected]";
		String to= "[email protected], [email protected]";
		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"));
		



發佈了32 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章