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服务器,所以我们只需要调用Transport的isConnected检测是否连接成功即可,该方法返回true表示已连接,返回false表示未连接。具体代码如下:

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", "您的邮箱", "邮箱授权码");

        result = ts.isConnected();

        ts.close();
    } catch (NoSuchProviderException e1) {
        result = false;
    } catch (MessagingException e) {
        result = false;
    }

    return result;
}

猜你喜欢

转载自blog.csdn.net/zyhlwzy/article/details/79989577