【划水的魚】網站註冊採用的是短信驗證的方式,採用的是阿里的短信sdk,最近想嘗試採用郵箱驗證的方式,於是整理一個相關的工具類。
註冊:
驗證碼:
1.郵箱驗證
sun提供的javaMail收發郵件工具類–javaMail。
1.1開啓qq郵箱的smtp/pop3協議的支持,並獲取生成的授權碼。這樣做:
1.2 接着,拉到下面,pop3/smtp服務 未開啓之前是“開啓”,開啓了之後是“關閉”,所以你需要“開啓”它,按照操作發短信完成相應的步驟後,會提示生成授權碼,那就點擊“生成授權碼”,之後複製下來保存好。後面會用到。
1.3 第二件事:需要下載jar包:
1.4 工具類(可帶附件)
package com.test;
import java.util.Properties;
import java.util.Random;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message.RecipientType;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
import com.sun.mail.util.MailSSLSocketFactory;
public class JavaMailUtils {
/**
* 發送郵件工具類:通過qq郵件發送,因爲具有ssl加密,採用的是smtp協議
* @param mailServer 郵件服務器的主機名:如 "smtp.qq.com"
* @param loginAccount 登錄郵箱的賬號:如 "[email protected]"
* @param loginAuthCode 登錄qq郵箱時候需要的授權碼:可以進入qq郵箱,賬號設置那裏"生成授權碼"
* @param sender 發件人
* @param recipients 收件人:支持羣發
* @param emailSubject 郵件的主題
* @param emailContent 郵件的內容
* @param resource 附件的路徑
* @param emailContentType 郵件內容的類型,支持純文本:"text/plain;charset=utf-8";,帶有Html格式的內容:"text/html;charset=utf-8"
* @return
*/
public static int sendEmail(String mailServer,final String loginAccount,final String loginAuthCode,String sender,String[] recipients,
String emailSubject,String emailContent,String emailContentType,String resource){
int res=0;
try {
//跟smtp服務器建立一個連接
Properties p = new Properties();
//設置郵件服務器主機名
p.setProperty("mail.host",mailServer);
//發送服務器需要身份驗證,要採用指定用戶名密碼的方式去認證
p.setProperty("mail.smtp.auth", "true");
//發送郵件協議名稱
p.setProperty("mail.transport.protocol", "smtp");
//開啓SSL加密,否則會失敗
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
p.put("mail.smtp.ssl.enable", "true");
p.put("mail.smtp.ssl.socketFactory", sf);
// 創建session
Session session = Session.getDefaultInstance(p, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
//用戶名可以用QQ賬號也可以用郵箱的別名:第一個參數爲郵箱賬號,第二個爲授權碼
PasswordAuthentication pa = new PasswordAuthentication(loginAccount,loginAuthCode);
return pa;
}
});
//設置打開調試狀態
session.setDebug(true);
//可以發送幾封郵件:可以在這裏 for循環多次
//聲明一個Message對象(代表一封郵件),從session中創建
MimeMessage msg = new MimeMessage(session);
//郵件信息封裝
//1發件人
msg.setFrom(new InternetAddress(sender));
//2收件人:可以多個
//一個的收件人
//msg.setRecipient(RecipientType.TO, new InternetAddress("收件人郵箱-自己填"));
InternetAddress[] receptientsEmail=new InternetAddress[recipients.length];
for(int i=0;i<recipients.length;i++){
receptientsEmail[i]=new InternetAddress(recipients[i]);
}
//多個收件人
msg.setRecipients(RecipientType.TO,receptientsEmail);
//3郵件內容:主題、內容
msg.setSubject(emailSubject);
//msg.setContent("Hello, 我是debug!!!", );//純文本
//msg.setContent(emailContent,emailContentType);//發html格式的文本
// 創建消息部分
BodyPart messageBodyPart = new MimeBodyPart();
// 消息
messageBodyPart.setText(emailContent);
// 創建多重消息
Multipart multipart = new MimeMultipart();
// 設置文本消息部分
multipart.addBodyPart(messageBodyPart);
// 附件部分
messageBodyPart = new MimeBodyPart();
// 設置要發送附件的文件路徑
DataSource source = new FileDataSource(resource);
messageBodyPart.setDataHandler(new DataHandler(source));
// messageBodyPart.setFileName(filename);
// 處理附件名稱中文(附帶文件路徑)亂碼問題
messageBodyPart.setFileName(MimeUtility.encodeText(resource));
multipart.addBodyPart(messageBodyPart);
// 發送完整消息
msg.setContent(multipart);
//發送動作
Transport.send(msg);
System.out.println("郵件發送成功");
res=1;
} catch (Exception e) {
System.out.println("郵件發送失敗: "+e.getMessage());
res=0;
}
return res;
}
public static void main(String[] args) throws Exception {
//郵件內容
String mailServer="smtp.qq.com";
final String loginAccount="你設置的發件郵箱";
final String loginAuthCode="你生成的授權碼";
String sender="你設置的發件箱";
String[] recipients={"[email protected]","[email protected]"};//這裏就是一系列的收件人的郵箱了
String emailSubject= "你好";
String code=smsCode();
//String emailContent= "你好,歡迎來我的blog: <a href='https://shukai.fun/'>我的blog:划水的魚</a>,祝您生活愉快!";//發HTML格式的文本
String emailContent= "你好,歡迎來我的博客【划水的魚】,你的驗證碼爲:"+code+",切勿將驗證碼泄漏於他人。";//純文本
String emailContentType="text/html;charset=utf-8";
String resource="D:\\001.txt";//附件路徑
int res=sendEmail(mailServer, loginAccount, loginAuthCode, sender, recipients, emailSubject, emailContent,emailContentType,resource);
System.out.println("\n發送結果:"+res);
}
/**
* @Tittle smsCode
* @decription 創建驗證碼
* @author shukai
* @param args
* @date 2019-10-22
*/
public static String smsCode(){
//int類型轉字符串類型(後面直接加一個字符串)
//隨機產生一個數字範圍爲0-1000000
String ran=new Random().nextInt(1000000)+"";
//作一個判斷條件使產生的數字的位數爲6位
if(ran.length()!=6){
//遞歸(如果長度不是6位就再調一下自己做判斷)
return smsCode();
}else{
return ran;
}
}
}