引言:
JavaMail jar包下載地址:http://java.sun.com/products/javamail/downloads/index.html
此篇是緊隨上篇文章而封裝出來的,閱讀本篇章建議先閱讀上一篇 --> javamail模擬郵箱功能發送電子郵件-基礎實戰篇
上一篇章簡單講解了javamail發送郵件的基本基礎和用到的幾個類,並且所有初始化和發送方法都封裝在一個類里面(為了代碼方便演示),本章節將對各個模塊進行拆分和優化,並且引入附件發送的方法
要想郵件發送附件,就要引入兩個新類 Multipart 和 BodyPart 兩類
Multipart(報文部件容器) 實則為一個報文容器,而郵件消息 Msage 是由各個子報文 BdyPart(報文單元部件) 類組成
由此可見所有郵件消息都可由這兩類來實現,接下來的演示發送HTML(兼並了普通Text格式)內容方法是所謂的簡單的模式,因為他只有正文部分,無需多個部件來組合,而附件采納了這兩類,我們可以把包涵附件的郵件拆分為兩個部件來理解,即:正文(郵件內容)部件、附件(郵件附加文件)兩個部件。
示例結構:
本篇示例代碼分了3類(其實可以說是2類,因為測試test類只有一個main方法來調用郵件發送方法)
- EmailEntity 類 郵件基礎父類,兩個私有屬性(發件地址,發件密碼),繼承了Authenticator自動校驗類(方便自動校驗)
- EmailServiceEnity 類 郵件服務支持類,繼承郵件基礎父類,並聲明其他必要的私有屬性,封裝郵件發送方法
- TestEmailFunction 類 郵件測試發送類,簡單的main方法里面初始化一個服務支持類,並調用兩個發送方法
實例代碼演示:
**************復制此三個類可直接跑測試**************注釋部分我盡可能詳細講解每個方法的作用**************
EmailEntity 類
package com.cplatform.movie.back.javamail; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * 郵件基礎實體類 * @author liuyt * @date 2014-10-24 下午2:12:10 */ public class EmailEntity extends Authenticator { /** * 用戶名(登錄郵箱) */ protected static String username; /** * 密碼 */ protected static String password; /** * 初始化郵箱地址和密碼 * @param username 郵箱 * @param password 密碼 */ public EmailEntity(String username, String password) { EmailEntity.username = "這里填寫發件箱地址"; EmailEntity.password = "這里填寫發件箱密碼"; } /** * 重寫自我檢驗方法 */ @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } String getPassword() { return password; } String getUsername() { return username; } public void setPassword(String password) { EmailEntity.password = password; } public void setUsername(String username) { EmailEntity.username = username; } }
EmailServiceEnity 類
package com.cplatform.movie.back.javamail; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.NoSuchProviderException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import com.cplatform.movie.back.javamail.SimpleEmailFunction.MyAuthenricator; import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility; /** * 郵件服務支持類 * @author liuyt * @date 2014-10-24 下午2:11:38 */ public class EmailServiceEnity extends EmailEntity{ // java.util.propertis 類 private transient Properties props; // 一個郵件會話 private transient Session session; // 郵件消息 private transient MimeMessage message; // 郵件內容格式 private final String CONTENT_TYPE_HTML = "text/html;charset=utf-8"; // 端口號 private final static int MAIL_PORT = 25; // 郵箱服務器列表 private String stmpHostPort; // 郵件傳輸對象 private Transport transport; // 郵件發送內容 private String content; /** * 實參構造 * @param mailToaddress 收件人地址,多個以逗號隔開 * @param content 郵件內容 * @throws MessagingException * @throws UnsupportedEncodingException */ public EmailServiceEnity(String mailToaddress, String content) throws UnsupportedEncodingException, MessagingException { super(username, password); this.content = content; this.session = this.initSession(); this.message = this.initMessage(this.getSession(), mailToaddress); this.transport = this.initTransport(this.getSession()); } /** * 根據發件人地址獲取郵件服務器主機地址 * @param username 發件人郵件地址 * @return */ public String getStmpHostP(String username) { return "smtp." + username.split("@")[1]; } /** * 初始化perps文件 * @return */ public Properties initPrope() { // 初始化props文件 props = new Properties(); props.setProperty("mail.transport.protocol", "smtp");//發送郵件協議 props.put("mail.smtp.auth", "true"); //需要驗證 props.put("mail.smtp.host", this.getStmpHostP(username)); //服務器地址 return props; } /** * 初始化session會話 * @return */ public Session initSession() { session = Session.getInstance(this.initPrope(),new MyAuthenricator(username, password)); session.setDebug(true); return session; } /** * 初始化Message消息 * @param session * @return * @throws MessagingException * @throws UnsupportedEncodingException */ public MimeMessage initMessage(Session session, String mailToaddress) throws MessagingException, UnsupportedEncodingException { message = new MimeMessage(session); // 設置發件人地址 message.setFrom(new InternetAddress(username, "要顯示的發件人名稱")); // 設置郵件主題 message.setSubject("主題:默認主題"); // 設置郵件發送內容和內容的content-type message.setContent(content.toString(),this.CONTENT_TYPE_HTML); // 設置郵件接收人地址 String [] address = mailToaddress.split(","); for(int i=0; i<address.length; i++) { // addRecipient(該方法為添加收件人列表,參數一為類型:TO-收件人,CC-抄送,參數二為一個郵件地址) message.addRecipient(Message.RecipientType.TO, new InternetAddress(address[i].trim())); // 下面方法為傳遞一個收件地址字符串 (二者方法任選其一即可) message.addRecipients(Message.RecipientType.CC, address[i].trim()); } return message; } /** * 初始化Transport * @param session * @return * @throws NoSuchProviderException */ public Transport initTransport(Session session) throws NoSuchProviderException { transport = session.getTransport(); return transport; } /** * 發送HTML內容郵件 (包括TEXT格式) * @throws MessagingException */ public void sendHtmlOrText() throws MessagingException { this.send(); } /** * 附件發送 * @param file java.io.File * @param fileName 附件名 * @throws MessagingException * @throws UnsupportedEncodingException */ public void sendFile(File file, String fileName) throws MessagingException, UnsupportedEncodingException { // 獲得Message實例 Message message = this.getMessage(); // 創建multipart容器用來容納bodyPart(部件) Multipart multipart = new MimeMultipart(); /** * 創建一個BodyPart內容報文 * 每個消息都有多個部分組成,每個部分是一個BodyPart報文部分,多個BodyPart部分又同時組成一個Multipart的容器 */ BodyPart messageBodyPart = new MimeBodyPart(); // 設置該報文的內容 messageBodyPart.setContent(this.content,this.CONTENT_TYPE_HTML); // 添加bodyPart報文部分到multiPart容器 multipart.addBodyPart(messageBodyPart); // 創建一個附件報文 messageBodyPart = new MimeBodyPart(); // 文件源 FileDataSource fds = new FileDataSource(file); // 設置郵件的內含附件 (設置數據源為復件) messageBodyPart.setDataHandler(new DataHandler(fds)); // 設置附件的文件名,需進行編碼,否則文件名會亂碼 messageBodyPart.setFileName(MimeUtility.encodeText(fileName)); // 添加到容器 multipart.addBodyPart(messageBodyPart); // 添加報文容器到消息實例 message.setContent(multipart); // 發送消息 this.send(); } /** * 發送 * 推薦使用方法一,因為方法二如果收件人為多個的話,會為每個人都打開一個Transport通道再關閉 * 而方法一在發送過程中一直保持連接通常,所有操作完成后才關閉 * @throws MessagingException */ public void send() throws MessagingException { // 方法一 this.getTransport().connect(); this.getTransport().sendMessage(message, message.getAllRecipients()); this.getTransport().close(); // 方法二 // Transport.send(this.getMessage()); } /***************** 提供必要的get set方法支持 ************飄逸的分割線****************/ public Session getSession() { return session; } public void setSession(Session session) { this.session = session; } public MimeMessage getMessage() { return message; } public void setMessage(MimeMessage message) { this.message = message; } public Properties getProps() { return props; } public String getContentTypeHtml() { return CONTENT_TYPE_HTML; } public static int getMailPort() { return MAIL_PORT; } public String getStmpHostPort() { return stmpHostPort; } public void setStmpHostPort(String stmpHostPort) { this.stmpHostPort = stmpHostPort; } public Transport getTransport() { return transport; } public void setTransport(Transport transport) { this.transport = transport; } public void setProps(Properties props) { this.props = props; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
TestEmailFunction 類
package com.cplatform.movie.back.javamail; import java.io.File; import java.io.UnsupportedEncodingException; import javax.mail.MessagingException; public class TestEmailFunction { public static void main(String[] args) { EmailServiceEnity e; // 多個收件人中間以逗號間隔 String mailToaddress = "418874847@qq.com,12450374@qq.com"; // 正文(內容)部分 String content = "點擊進入» <a href='http://www.cnblogs.com/liuyitian'>劉一天的博客</a>"; try { e = new EmailServiceEnity(mailToaddress, content); e.sendHtmlOrText(); // 測試HTML文本 /** * 切勿使用同一個EmailServiceEnity實例來發送不同內容,如有需要就再初始化一個新實例(否則附件發送失敗且亂碼) * 因為每個實例在發送完郵件后就會關閉Transport */ e = new EmailServiceEnity(mailToaddress, content); // 傳入一個絕對位置的文件路徑 File file = new File("d:/data/adimg/20141022/09/ad_20141022094708943.jpg"); e.sendFile(file,"測試復件.jpg"); // 測試復件發送 } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (MessagingException e1) { e1.printStackTrace(); } } }
本章小結:
- 對代碼進行模塊化,分為實體類和業務類
- 利用繼承,來共享父類的屬性
- 簡單責任原則,業務類里面能拆分的功能都進行拆分,各負其責,方便調試
- 復用性,本章體現在郵件的發送功能,真正實現發送功能的是send方法
- 其他細節:(附件編碼問題,正文格式聲明,設置收件人方法【多種】)
- 未涉及:郵件協議
javamail API 系列篇:
- javamail模擬郵箱功能發送電子郵件-基礎實戰篇
- javamail模擬郵箱功能發送電子郵件-中級實戰篇【新增附件發送方法】
- javamail模擬郵箱功能獲取郵件內容-中級實戰篇【內容|附件下載方法】
- javamail模擬郵箱功能--郵件回復-中級實戰篇【郵件回復方法】
- javamail模擬郵箱功能--郵件刪除-中級實戰篇【郵件標記方法】
寫作不易,難免有疏漏和錯誤,還請慷慨指正,覺得有幫助還請推薦哦。
ps:歡迎轉載,轉載請注明出處:http://www.cnblogs.com/liuyitian/p/4049402.html
每天多學一點點 代碼少敲一點點