引言:
JavaMail 是一種可選的、能用於讀取、編寫和發送電子消息的包
JavaMail jar包下載地址:http://java.sun.com/products/javamail/downloads/index.html
JavaMail API中包含了多種郵件傳輸協議: SMTP POP(最新為pop3) IMAP MIME 四大類 (本章主要講解常用的 SMTP)
該API的幾大核心類:會話(session)、消息(message)、地址(address)、驗證程序(Authentication)、傳輸(Transport),存儲和文件夾
廢話不多說,跟着例子一步步解釋每個類的主要功能 —.—
實例代碼演示:
**********************此例可直接復制粘帖至編譯器進行測試哦**********************
package com.cplatform.movie.back.test; import java.io.UnsupportedEncodingException; import java.util.Properties; import javax.mail.Address; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * javaMail API 模擬郵箱發送電子郵件 * @author liuyt * @date 2014-10-24 上午10:10:51 */ public class EmailFunction { /** * 發送郵件的props文件 (可使用自建priperty文件) * 用於初始化一個session實例,配置了一個session會話的一些基本信息 */ private final transient Properties props = new Properties(); /** * 郵件發送者的用戶名和密碼 */ private transient String username = "15138577682@163.com"; private transient String password = "郵箱密碼"; /** * session為一個基本的郵件會話,通過該會話可執行其他郵件工作 * 如:之后的初始化一個MimeMessage實例 */ private transient Session session; /** * MIME類型郵件MimeMessage類(抽象消息類Message的一個子類) * 可以通過將Session對象傳遞給MimeMessage構造器的方法來創建 */ private transient MimeMessage message; /** * 郵件內容類型 (這里演示一個html格式的消息格式) */ private final static String CONTENT_TYPE_HTML = "text/html;charset=utf-8"; /** * 端口號 */ private final static int MAIL_PORT = 25; /** * 郵件內容 */ private String content = "點擊進入» <a href='http://www.cnblogs.com/liuyitian'>劉一天的博客</a>"; /** * 繼承Authenticator子類用於用戶認證 (這里指郵件服務器對用戶的認證) * 也可外部創建一個單獨的郵件實體類(包涵用戶名/密碼即可),繼承Authenticator類來重寫PasswordAuthentication方法 */ static class MyAuthenricator extends Authenticator{ private String user=null; private String pass=""; public MyAuthenricator(String user,String pass){ this.user=user; this.pass=pass; } @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user,pass); } } /** * 初始化 session 實例方法 * @param username 發送郵件的用戶名(地址) * @param password 密碼 * @param smtpHostName SMTP郵件服務器地址 */ private void initSession(String username, String password, String smtpHostName) { // 初始化props文件 props.setProperty("mail.transport.protocol", "smtp");//發送郵件協議 props.put("mail.smtp.auth", "true"); //需要驗證 props.put("mail.smtp.host", smtpHostName); //服務器地址 // 根據property文件創建session,並傳入Authenticator進行驗證 session = Session.getInstance(props, new MyAuthenricator(username, password)); // 是否控制台打印消息列表 (可選) session.setDebug(true); } /** * 初始化郵箱message(消息實例)方法 * @param subject 郵件主題 * @param content 郵件內容 * @throws MessagingException * @throws AddressException * @throws UnsupportedEncodingException */ private void initMessage(String subject, Object content) throws AddressException, MessagingException, UnsupportedEncodingException { // 根據session創建一個消息對象 message = new MimeMessage(session); // 設置發件人地址 (第二個參數為顯示發件人名稱,目前還沒有測試成功) message.setFrom(new InternetAddress(username, "要顯示的發件人名稱")); // 設置郵件的主題 message.setSubject("主題:javamail測試郵件"); // 設置郵件的發送內容和內容的content-type(這里采用text/html格式) message.setContent(content.toString(),EmailFunction.CONTENT_TYPE_HTML); // 設置郵件的接收人地址--方法一 (選其一即可) // Address[] address = new Address[]{new InternetAddress("418874847@qq.com"),"...更多列表..."}; // message.setReplyTo(addresses); // 設置郵件的接收人地址--方法二 (選其一即可) // 如果群發郵件,收件人較多,可另寫一個方法用於專門循環遍歷並設置接收人 message.addRecipient(Message.RecipientType.TO, new InternetAddress("418874847@qq.com")); message.addRecipient(Message.RecipientType.TO, new InternetAddress("12450374@qq.com")); } /** * 初始化郵件發送器方法 * @param username 發送郵件的用戶名(地址),並以此解析SMTP服務器地址 * @param password 發送郵件的密碼 * @throws MessagingException * @throws UnsupportedEncodingException * @throws AddressException * @return */ public void SimpleMailSender(final String username, final String password) throws AddressException, UnsupportedEncodingException, MessagingException { // 通過郵箱地址解析出smtp服務器,對大多數郵箱都管用 (還有IMAP和POP3) final String smtpHostName = "smtp." + username.split("@")[1]; // 調用初始化session方法 initSession(username, password, smtpHostName); // 調用初始化MimeMessage方法 (在初始化session完畢后) initMessage("郵件主題:測試郵件", content); } /** * 郵件發送 * @throws MessagingException * @throws UnsupportedEncodingException */ private void send() throws MessagingException, UnsupportedEncodingException { // 調用初始化郵件方法 SimpleMailSender(username, password); // 根據session來獲得一個Transport抽象類對象 Transport tran = session.getTransport(); // 打開鏈接 ,此時會去校驗用戶名和密碼 (參數列表:【 郵箱服務器地址】【端口號】【 發件箱用戶名】【發件箱密碼】) tran.connect(props.getProperty("mail.smtp.host"), EmailFunction.MAIL_PORT, username, password); // 發送郵件 (第二個參數null指收件人地址,因為在初始化message時已經設置好了收件人地址,此處便省略) tran.sendMessage(message, null); // 關閉通道 tran.close(); } /** * main方法測試 * @param args * @throws AddressException * @throws MessagingException * @throws UnsupportedEncodingException */ public static void main(String[] args) throws AddressException, MessagingException, UnsupportedEncodingException { //直接調用發送方法 new EmailFunction().send(); } }
小結簡單流程:
根據實例代碼,來總結下用javamail來發送一封簡單郵件的流程
- 下載javamail API jar包,並path到項目中去。(jar包下載地址請看本章開頭)
- 創建一個java bean,設置必要私有屬性,提高代碼的復用性和可讀性
- 創建內部類並繼承Authenticator (驗證機制)類,提供必要屬性用戶名和密碼,重寫getPasswordAuthentication方法
- 根據java.util.property文件初始化一個郵件的Session會話實例
- 根據步驟四得來的Session實例來初始化一個Message(消息)實例,並設置各個參數(收、發件人、主題、內容等)
- 根據Session創建一個Transport(傳輸)實例 --> 打開鏈接(connect) --> 發送(sendMessage) --> 關閉(close)
上述流程是依據本章的實例代碼來羅列的,只是讓大家對流程有個簡單的認識,代碼本身可能並不精簡,還請哆哆指正。
javamail API 系列篇:
- javamail模擬郵箱功能發送電子郵件-基礎實戰篇
- javamail模擬郵箱功能發送電子郵件-中級實戰篇【新增附件發送方法】
- javamail模擬郵箱功能獲取郵件內容-中級實戰篇【內容|附件下載方法】
- javamail模擬郵箱功能--郵件回復-中級實戰篇【郵件回復方法】
- javamail模擬郵箱功能--郵件刪除-中級實戰篇【郵件標記方法】
寫作不易,難免有疏漏和錯誤,還請慷慨指正,覺得有幫助還請推薦哦。
轉載請注明出處:http://www.cnblogs.com/liuyitian/p/4048006.html
每天多學一點點 代碼少敲一點點