最近的项目需要邮箱验证,因此整理分离了一个邮箱验证的工具类,方便下次使用
发送邮件的方法类(发送方以qq的smtp为例)
public class EmailUtil {
//发件人邮箱地址
private static String FROM_MAIL=codeToString("email@qq.com");
//发件人邮箱密码
private static String PASSWORD = codeToString("password");
/**
* 发送邮件
* @param email 收件人邮箱地址
*/
public static void sendEmail(String email){
//邮件标题
String title=codeToString("标题");
//获取6位验证码
String code =RandNum.getRandNum(6);
//邮件内容
String content=codeToString("验证码为"+code);
//用于封装邮件服务的地址、用户名、密码等信息
Properties props = System.getProperties();
// 存储发送邮件服务器的信息
props.put("mail.smtp.host", "smtp.qq.com");
// 同时通过验证
props.put("mail.smtp.auth", "true");
//邮箱用户名和密码认证器
MyAuthenticator myauth = new MyAuthenticator(FROM_MAIL, PASSWORD);
// 根据属性新建一个邮件会话
Session s = Session.getDefaultInstance(props, myauth);
// 由邮件会话新建一个消息对象
MimeMessage message = new MimeMessage(s);
// 设置邮件
try {
//发送方邮件地址
InternetAddress from = new InternetAddress(FROM_MAIL);
//设置发件人
message.setFrom(from);
//设置收件人
InternetAddress to = new InternetAddress(email);
//设置其接收类型为TO
message.setRecipient(Message.RecipientType.TO, to);
// 设置主题
message.setSubject(title);
// 设置信件内容
message.setText(content);
// 设置发信时间
message.setSentDate(new Date());
// 存储邮件信息
message.saveChanges();
Transport transport = s.getTransport("smtp");
/*以SMTP方式登录邮箱,
第一个参数是发送邮件用的邮件服务器SMTP地址
第二个参数为邮件服务器SMTP的端口号
第三个参数为用户名
第四个参数为密码*/
transport.connect("smtp.qq.com",587, FROM_MAIL, PASSWORD);
// 发送邮件,其中第二个参数是所有已设好的收件人地址
transport.sendMessage(message, message.getAllRecipients());
transport.close();
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
/**
* 处理中文字符串的函数
* @param str
* @return
*/
public static String codeToString(String str) {
String s = str;
try {
byte tempB[] = s.getBytes("UTF-8");
s = new String(tempB);
return s;
} catch (Exception e) {
return s;
}
}
}
邮箱用户名和密码认证器
public class MyAuthenticator extends javax.mail.Authenticator {
private String strUser;
private String strPwd;
/**
* 认证器的构造方法
* @param user
* @param password
*/
public MyAuthenticator(String user, String password) {
this.strUser = user;
this.strPwd = password;
}
/**
* 获取一个邮箱的密码认证器
*/
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(strUser, strPwd);
}
}
生成n位随机数的方法
public class RandNum {
/**
* 获取n位随机的方法
* @param charCount 随机数位数
* @return 随机验证码
*/
public static String getRandNum(int charCount){
String charValue = "";
for(int i=0;i<charCount;i++){
//获取0-10的随机数,并转换为char型
char c = (char)(randomInt(0,10)+'0');
charValue += String.valueOf(c);
}
return charValue;
}
/**
* 获取一位从from到to之间的随机整数
* @param from
* @param to
* @return
*/
private static int randomInt(int from,int to){
Random r = new Random();
return from+r.nextInt(to-from);
}
}
若发送失败,请先确认发放方邮箱的smtp是否开启,此外邮箱密码填写smtp的授权码而非登陆密码。