javamail模擬郵箱功能發送電子郵件-基礎實戰篇(javamail API電子郵件實例)


引言:

  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 系列篇:   

  1. javamail模擬郵箱功能發送電子郵件-基礎實戰篇
  2. javamail模擬郵箱功能發送電子郵件-中級實戰篇【新增附件發送方法】
  3. javamail模擬郵箱功能獲取郵件內容-中級實戰篇【內容|附件下載方法】
  4. javamail模擬郵箱功能--郵件回復-中級實戰篇【郵件回復方法】
  5. javamail模擬郵箱功能--郵件刪除-中級實戰篇【郵件標記方法】

 

                            寫作不易,難免有疏漏和錯誤,還請慷慨指正,覺得有幫助還請推薦哦。

  轉載請注明出處http://www.cnblogs.com/liuyitian/p/4048006.html


                                              每天多學一點點     代碼少敲一點點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM