第二講:使用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參數 |
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;
}