1. 程式人生 > >java實現郵箱驗證QQ郵箱驗證和Foxmail驗證

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。