JavaMail使用(檢測郵箱是否能收件和發件)

使用過JavaMail我們都知道,通過JavaMail這個工具,我們可以在自己的系統中實現郵件收發功能。本文我們將給出如何檢測我們所設置的郵箱是否能接收和發送郵件。

首先、如果您想要實現郵件接受和發送功能,您需要在郵箱中開啓POP3和SMTP協議。一般情況下,POP3協議用於郵件的接受,SMTP協議用於郵件的發送。我們以QQ郵箱爲例,如果您需要在您的系統中使用一個QQ郵箱爲您接受和發送郵件,首先您需要進入QQ郵箱的設置頁面,開啓POP3和SMTP服務。

這裏寫圖片描述

SMTP和POP3服務開啓之後,您需要獲取一個授權碼,在接收郵件和發送郵件時需要使用該授權碼而不是登錄密碼。一切設置就緒之後,我們來看如何通過Java Mail來檢查您所設置的郵箱信息是否能夠收件和發件。

1、收件檢測

JavaMail API中定義了一個java.mail.Store類,它用於執行郵件接受任務,這個類的實例對象封裝了某種郵件接受協議的底層實施細節,應用程序調用這個類中的方法就可以獲得用戶郵箱中的各種郵件夾的信息。JavaMail使用Folder對象表示郵件夾,通過Folder對象的方法應用程序進而又獲得該郵件夾中的所有郵件信息,而每封郵件信息JavaMail又分別使用一個Message對象進行封裝。收件過程如下:

  • 從Session對象中獲得實現了某種郵件發送協議的Store對象

  • 以某個郵箱賬戶的身份連上POP3服務器

  • 調用Store的getFolder方法,獲取代表該賬戶的郵箱中的某個郵件夾的Folder對象。

  • 調用Folder對象中的getMessages或getMessage方法,獲取郵件夾中所有郵件或者某一封郵件,每封郵件以一個Message對象返回

那麼如果我們需要檢查我們設置的郵箱是否能夠收件,我們只需要調用Store的isConnected方法,該方法用於檢測客戶端與郵件服務器是否已連接。該方法返回true表示已連接,返回false表示未連接。具體實現方法如下:

public static boolean checkReceive() {
    String host = "pop.qq.com";//以QQ郵箱爲例
    String username = "您的郵箱";
    String password = "授權碼";
    String port = "服務端口號,QQ郵箱是995";

    boolean result = false;

    Properties p = new Properties();
    p.setProperty("mail.pop3.host", host); // 按需要更改
    p.setProperty("mail.pop3.port", port);
    // SSL安全連接參數
    p.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    p.setProperty("mail.pop3.socketFactory.fallback", "true");
    p.setProperty("mail.pop3.socketFactory.port", port);

    Session session = Session.getDefaultInstance(p, null);
    Store store;
    try {
        store = session.getStore("pop3");
        store.connect(host, username, password);

        result = store.isConnected();
    } catch (Exception e) {
        result = false;
    }

    return result;
}

2、發件檢測

JavaMail API中定義了一個java.mail.Transport類,它專門用於執行郵件發送服務,這個類的實例對象封裝了某種郵件發送協議底層實施細節,應用程序調用這個類中的方法可以把Message對象封裝的郵件數據發送到指定的SMTP服務器。使用JavaMail發送郵件時過程如下:

  • 從Session對象中獲得實現了某種郵件發送協議的Transport對象

  • 使用Session對象創建Message對象,並調用Message對象的方法封裝郵件數據。

  • 連接指定的SMTP服務器,調用Transport對象中的郵件發送方法發送Message對象中封裝的郵件數據。

那麼我們需要檢測我們設置的郵箱信息是否正確,其實只是檢測我們是否能夠成功連接SMTP服務器即可。具體代碼如下:

public static boolean checkSend() throws GeneralSecurityException {
    Properties prop = new Properties();
    prop.setProperty("mail.host", "smtp.qq.com");
    prop.setProperty("mail.smtp.port", "SMTP端口");
    prop.setProperty("mail.transport.protocol", "smtp");
    prop.setProperty("mail.smtp.auth", "true");
    //設置超時時間爲20秒
    prop.setProperty("mail.smtp.timeout", "20000");

    if("SSL加密端口"){
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
           sf.setTrustAllHosts(true);
           prop.put("mail.smtp.ssl.enable", "true");
           prop.put("mail.smtp.ssl.socketFactory", sf);
    }

    boolean result = false;

    //1、創建session
    Session session = Session.getInstance(prop);
    //開啓Session的debug模式,這樣就可以查看到程序發送Email的運行狀態
    session.setDebug(true);
    //2、通過session得到transport對象
    Transport ts;
    //3、使用郵箱的用戶名和密碼連上郵件服務器,發送郵件時,發件人需要提交郵箱的用戶名和密碼給smtp服務器,用戶名和密碼都通過驗證之後才能夠正常發送郵件給收件人。
    try {
        ts = session.getTransport();
        ts.connect("smtp.qq.com", "您的郵箱", "郵箱授權碼");
        ts.close();
        result = true;
    } catch (NoSuchProviderException e1) {
        result = false;
    } catch (MessagingException e) {
        result = false;
    }

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