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

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

       在第二講的第一部分主要講解了MIME在JavaMail中如何表示以及使用MimeMessage進行創建純文本和HTML類郵件的講解。下面將會講解如何使用MimeBodyPart和MimeMultipart等類創建含有組合消息、附件等較複雜的郵件。

一、MimeBodyPart類
      javax.mail.internet.MimeBodyPart類 表示的是一個MIME消息,它和MimeMessage類一樣都是從Part接口繼承過來。
      下面介紹一下常用的函數:
MimeBodyPart()
MimeBodyPart(java.io.InputStream is)                                                                                                                                                                                                                                                                                                 
is參數表示從輸入流中讀取數據,並使用讀取到的數據填充MimeBodyPart實例對象
setDDataHandler(javax.activation.DataHandler dh)     設置該對象後,MimeBodyPart在生成具體的MIME消息時會調用該對象的方法獲取所需要的數據信息。DataHandler是JAF中定義的一個類,是一種數據訪問接口,可以讀取各種數據源中的數據和返回數據源的MIME類型。
setContentID(java.lang.String cid) 設置消息頭中的“Content-ID”頭字段
setDisposition(java,lang.String disposition) 設置消息頭中的"Content-Disposition"字段,如果當前MIME消息作爲郵件中的附件部分,那麼可以使用這個方法設置。
setFileName(java.lang.String filename) 常用於設置郵件附件名,即設置”Content-Disposition“中filename參數
二、MimeMultipart類
        javax.mail.internet.MimeMultipart是抽象類 Multipart的實現子類,它用來組合多個MIME消息。一個MimeMultipart對象可以包含多個代表MIME消息的MimeBodyPart對象。
其主要函數有:
Mimemultipart()
MimeMultipart(java.lang.String type)                                                                                                  
缺省類型時"multipart/mixed"即 Mimemultipart對象代表的組合MIME消息的Content-Type屬性值爲"multipart/mixed",其他類型包括"multipart/related","multipart/alternative"
addBodyPart(BodyPart bp)
addBodyPart(BodyPart bp, int index)
新增一個BodyPart對象到Mimemultipart對象中,其位置位於原有的Mimemultipart對象列表的尾部,用index指定新增的BodyPart插入的位置
setSubType(java.lang.String type) 用於設置Content-Type中MIME的子類型,      有:"mixed","related",”alternative"
getContentType():String 返回Content-Type類型
getBodyPart(int index)
getBodyPart(java.lang.String cid)
返回Mimemultipart對象中位於index位置或爲cid的BodyPart對象
getCount():int 返回Mimemultipart對象中保存的BodyPart對象的個數
下面圖是用來顯示MIME中各個對象將的組合關係:

三、應用舉例
例一:創建包含內嵌圖片的郵件
         前面的例子中是單獨的使用HTML或者是純文本內容,但是有時候我們需要在純文本中使用內嵌的方式顯示一些圖片,因此就要將純文本和內嵌圖片單獨存放在MimeBodyPart中然後再將其存放在一個Mimemultipart對象中即可。
		String from = "[email protected]";
		String to= "[email protected],[email protected]";
		String body = "<h4>歡迎大家閱讀郵件</h4>" 
		+"<a href = \"http://blog.csdn.net/wenwen1538\">歡迎訪問我的主頁</a>";
		
		String subject = "HTML郵件";
		
		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());
		
		//創建一個子類型爲"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 imgBodyPart = new MimeBodyPart();	
		FileDataSource fds = new FileDataSource("D:\\蝸牛的世界.png");
		imgBodyPart.setDataHandler(new DataHandler(fds));
		imgBodyPart.setContentID("uind--woniu--png-001");
//		imgBodyPart.setHeader("Content-ID", "uind--woniu--png-001");
		/**
		 * 不需要使用下面的語句來設置圖片的MIME類型,因爲JAF框架中的DataSource對象可以返回數據源的MIME類型,
		 * 因此上面的setDataHandler()可以設置MIME類型
		 */
//		imgBodyPart.setHeader("Content-Type", "image/gif");
		multipart.addBodyPart(imgBodyPart);
		
		//將multipart對象設置爲整個郵件的內容,要使用saveChanges進行更新
		msg.setContent(multipart);
		msg.saveChanges();
		
		//將對象寫入文件中
		msg.writeTo(new FileOutputStream("d:\\test.eml"));
		
例二:創建有內嵌圖片、附件(普通文件、聲音)的組合複雜郵件
	public static void main(String[] args) throws AddressException, MessagingException, FileNotFoundException, IOException {
		
		String from = "[email protected]";
		String to= "[email protected], [email protected]";
		String body = "<h4>歡迎大家閱讀郵件</h4>" 
		+"<a href = \"http://blog.csdn.net/wenwen1538\">歡迎訪問我的主頁</a>";
		
		String subject = "HTML郵件";
		
		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());
		
		//創建代表郵件正文和附件的各個對象
		MimeBodyPart contentPart = createContent(body, "D:\\蝸牛的世界.png");
		MimeBodyPart attactment1 = createAttachment("D:\\create.sql");
		MimeBodyPart attachment2 = createAttachment("D:\\TTPmusic\\Maroon 5 - One More Night.mp3");
		
		//下面組合郵件正文和附件的Mimemultipart對象
		MimeMultipart allMultipart = new MimeMultipart("mixed");
		allMultipart.addBodyPart(contentPart);
		allMultipart.addBodyPart(attactment1);
		allMultipart.addBodyPart(attachment2);
		
		//將multipart對象設置爲整個郵件的內容,要使用saveChanges進行更新
		msg.setContent(allMultipart);
		msg.saveChanges();
		
		//將對象寫入文件中
		msg.writeTo(new FileOutputStream("d:\\test.eml"));
	}
	
	public static MimeBodyPart createContent(String body, String filename) throws MessagingException{
		
		//創建一個MimeBodyPart對象存放Mimemultipart對象
		MimeBodyPart contentBodyPart = new MimeBodyPart();
		
		//創建一個子類型爲"related"的Mimemultipart對象
		MimeMultipart multipart = new MimeMultipart();
		multipart.setSubType("related");
		//創建一個HTML正文的MimeBodyPart對象,並將其加載到Mimemultipart對象中
		MimeBodyPart htmlBodyPart = new MimeBodyPart();
		htmlBodyPart.setContent(body, "text/html; charset=gb2312");
		multipart.addBodyPart(htmlBodyPart);
		
		//創建一個圖片內容的MimeBodyPart對象並將其加入前面創建的Mimemultipart對象中
		MimeBodyPart imgBodyPart = new MimeBodyPart();
		FileDataSource fds = new FileDataSource(filename);
		imgBodyPart.setDataHandler(new DataHandler(fds));
		imgBodyPart.setContentID("uind--woniu--png-001");
		multipart.addBodyPart(imgBodyPart);
	
		//將Mimemultipart對象加入到MimeBodyPart對象中
		contentBodyPart.setContent(multipart);
		return contentBodyPart;
	}
	
	public static 	MimeBodyPart createAttachment(String filename) throws MessagingException{
		//創建保存附件的MimeBodyPart對象,並且加入附件內容和相應的信息
		MimeBodyPart attachmentPart = new MimeBodyPart();
		FileDataSource fds = new FileDataSource(filename);
		attachmentPart.setDataHandler(new DataHandler(fds));
		attachmentPart.setFileName(fds.getName());
		return attachmentPart;
	}

 













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章