java实现邮箱验证QQ邮箱验证和Foxmail验证

这两天公司要求做个Android端邮箱认证,android端还是很简单的,主要难点在后台链接邮箱并发送邮件。
思路:android端传送邮箱地址给后台,后台获取邮箱地址后,链接公司邮箱,并发送验证码邮件,并返回邮箱地址+验证码给Android端,Android进行验证邮箱地址和验证码是否匹配。

直接上后台代码,已经写成工具类,注释很清楚了。

工程需要导入mail.jar 架包下载地址

import java.util.Properties;
import java.util.Random;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.sun.mail.util.MailSSLSocketFactory;

public class MailboxVerification {

    public static void main(String args[]) {
        qqSendMail("发件邮箱", "邮箱密码", "smtp.qq.com",
         "收件邮箱");

         foxmailSendMail("发件邮箱", "密码",
         "邮件服务器", "收件人邮箱");
    }

    /**
     * Foxmail邮箱验证
     * 
     * @param fromMail
     *            发件人邮箱
     * @param fromPwd
     *            发件人密码
     * @param mailServicer
     *            邮件服务器
     * @param toMail
     *            收件人邮箱
     * @return 收件人邮箱+验证码
     */
    public static String foxmailSendMail(String fromMail, String fromPwd,
            String mailServicer, String toMail) {
        String code = createCode();
        StringBuffer st = new StringBuffer();
        // 获取系统属性
        Properties properties = new Properties();
        // 身份验证开启
        properties.put("mail.smtp.auth", "true");
        // debug模式
        properties.put("mail.debug", "true");
        // 邮件服务器
        properties.setProperty("mail.host", mailServicer);
        // 邮箱传送协议
        properties.setProperty("mail.transport.protocol", "smtp");
        // 获取默认session对象
        Session session = Session.getInstance(properties);
        session.setDebug(true);
        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);
            // 头部头字段
            message.setFrom(new InternetAddress(fromMail));
            // 头部头字段
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(
                    toMail));
            // 头部头字段
            message.setSubject("请及时验证邮箱");
            // 设置消息体
            message.setText("邮箱验证码:" + code);
            Transport transport = session.getTransport();
            transport.connect(mailServicer, fromMail, fromPwd);
            transport.sendMessage(message, new Address[] { new InternetAddress(
                    toMail) });
            transport.close();
            st.append(toMail + ":" + code);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return st.toString();
    }

    /**
     * QQ邮箱验证
     * 
     * @param fromMail
     *            发件人邮箱
     * @param fromPwd
     *            发件人密码
     * @param mailServicer
     *            邮件服务器
     * @param toMail
     *            收件人邮箱
     * @return 收件人邮箱+验证码
     */
    public static String qqSendMail(String fromMail, String fromPwd,
            String mailServicer, String toMail) {
        String code = createCode();
        StringBuffer st = new StringBuffer();
        Properties props = new Properties();
        // 开启debug调试
        props.setProperty("mail.debug", "true");
        // 发送服务器需要身份验证
        props.setProperty("mail.smtp.auth", "true");
        // 设置邮件服务器主机名
        props.setProperty("mail.host", mailServicer);
        // 发送邮件协议名称
        props.setProperty("mail.transport.protocol", "smtp");
        try {
            // 添加ssl加密,qq需要传输过程ssl加密
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.enable", "true");
            props.put("mail.smtp.ssl.socketFactory", sf);
            Session session = Session.getInstance(props);
            // 邮件内容部分
            Message msg = new MimeMessage(session);
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
                    toMail));
            // 头部头字段
            msg.setSubject("请及时验证邮箱");
            // 设置消息体
            msg.setText("邮箱验证码:" + code);
            // 邮件发送者
            msg.setFrom(new InternetAddress(fromMail));
            // 发送邮件
            Transport transport = session.getTransport();
            transport.connect(mailServicer, fromMail, fromPwd);
            transport.sendMessage(msg, new Address[] { new InternetAddress(
                    toMail) });
            transport.close();
            st.append(toMail + ":" + code);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return st.toString();
    }

    /**
     * 产生四位随机数
     * 
     * @return
     */
    public static String createCode() {
        Random random = new Random();
        String fourRandom = random.nextInt(10000) + "";
        int randLength = fourRandom.length();
        if (randLength < 4) {
            for (int i = 1; i <= 4 - randLength; i++)
                fourRandom = "0" + fourRandom;
        }
        return fourRandom;
    }
}

总结:
1、老报身份验证异常,然后开启debug,也没有看到有用的信息,猜想是身份验证时候的姿势出错了。
2、 解决方案qq开启pop3和smtp验证,会产生一段第三方登录的授权码,这个就是发件邮箱的登录密码。
3、foxmail、QQ验证时,不要把发件人邮箱的地址和密码放到props对象里,而是通过transport链接的时候,携带用户名和密码。

注意以上问题,就可以解决身份验证失败BUG。

你可能感兴趣的:(java)