JavaMail实现邮箱验证码

  笔者最近在学习系统登录使用的邮箱验证码的功能实现,下面给出使用JavaMail实现发送邮箱验证码的代码。本代码使用的是163的邮件服务器,可以根据需要更换别的服务器。

import java.util.Arrays;
import java.util.Properties;
import java.util.Random;

import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {

    public static String send(String email) {
        Properties p = new Properties();
        p.put("mail.smtp.host", "smtp.163.com");  //smtp服务器地址,可以使用别的 
        p.put("mail.smtp.auth", "true");
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("(您的163邮箱)","(您的邮箱密码)");
            }
        };
        //获得一个带有authenticator的session实例 
        Session sendMailSession = Session.getDefaultInstance(p,authenticator);
        Message mailMessage = new MimeMessage(sendMailSession);
        
        //产生4位验证码
        Random r = new Random();
        StringBuffer captcha1 = new StringBuffer();
        for (int i = 0; i < 4; i++) {
            captcha1.append(r.nextInt(9)+"");
        }
        String captcha = new String(captcha1);
        
        try {
            System.out.println("I'm sending...");
            Address from = new InternetAddress("(您的163邮箱)");
             //设置发出方
            mailMessage.setFrom(from);
            Address to = new InternetAddress(email);//设置接收人员
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            mailMessage.setSubject("验证码");//设置邮件标题
            mailMessage.setText(captcha); //设置邮件内容
            // 发送邮件
            Transport.send(mailMessage);
            return captcha;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
    
    public static void main(String[] args) {
        SendEmail.send("[email protected]");
    }

}

  上面是发送验证码的实现。如果要实现日常我们注册时正常的功能,即需要控制验证码的有效时间,最简单的可以使用cookie实现,设置cookie过期时间即可。也可以借助数据库来实现,即注册时在用户表插入用户信息,同时保存发送验证码的时间,当用户输入验证码后可以查询数据库保存的时间与当前时间比较即可实现,而且,我们可以在用户表中添加一个status字段,判断用户是注册成功还是尚未注册成功。

  至于日常我们碰到的通过向邮箱发送激活邮件,用户点击激活邮件激活账户的也同样类似,可以在数据库中保存一个随机的key值,然后在发送的链接后面拼接用户id还有随机key,用户点击后取出链接的用户id和key值即可判断哪个用户已经成功注册。


你可能感兴趣的:(java学习)