java實現郵箱驗證QQ郵箱驗證和Foxmail驗證
阿新 • • 發佈:2019-02-13
這兩天公司要求做個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。