有些網(wǎng)站在注冊的時候,,會向用戶的郵箱發(fā)送郵件,,點擊郵件中的鏈接激活賬戶,,基本原理就是在注冊的時候(即點擊發(fā)送郵件的時候),先把用戶的信息存進數(shù)據(jù)庫,,另外還有一個激活狀態(tài)的字段(默認是未激活)點擊郵件中的鏈接,,驗證通過之后,該字段狀態(tài)會改為已激活,,郵件中的鏈接信息包括:用戶id(只要是在數(shù)據(jù)庫中能找到對應的數(shù)據(jù)就行,,不一定是id),激活碼,,點擊這個鏈接之后,,會把這些數(shù)據(jù)傳到我們寫好的一個方法里面,只要在這個方法里面驗證即可,。 業(yè)務流程 1,、用戶提交注冊信息 2、寫入數(shù)據(jù)庫,,此時賬號未激活 3,、將用戶名密碼或其他標識字符進行加密構成激活碼 4、將激活碼和用戶的id組成URL發(fā)送到郵箱 5,、用戶登陸郵箱,。點擊URL激活 6、驗證激活碼,,正確就激活賬號,,更改激活狀態(tài) 數(shù)據(jù)庫設計
發(fā)送郵件 發(fā)送郵件之前需要加載phpemailer類,,可以看我上一篇文章Thinkphp5+PHPMailer實現(xiàn)發(fā)送郵件 public function index() { $toemail = '[email protected]'; //這里寫的是收件人的郵箱 $active_url = "http://test.zxf/index/sendmail/active.html?id=1&active_key=123"; $body = "親愛的".$toemail.":<br/>感謝您在我站注冊了新賬號。<br/>請點擊鏈接激活您的賬號,。<br/> <a href='".$active_url."' target= '_blank'>點擊激活</a><br/> 如果以上鏈接無法點擊,請將它復制到你的瀏覽器地址欄中進入訪問,,該鏈接24小時內(nèi)有效,。"; $mail=new Phpmailer(); $mail->isSMTP(); // 使用SMTP服務(發(fā)送郵件的服務) $mail->CharSet = "utf8"; // 編碼格式為utf8,不設置編碼的話,,中文會出現(xiàn)亂碼 $mail->Host = "smtp.qq.com"; // 發(fā)送方的SMTP服務器地址 $mail->SMTPAuth = true; // 是否使用身份驗證 $mail->Username = "[email protected]"; // 申請了smtp服務的郵箱名(自己的郵箱名) $mail->Password = "xxxx"; // 發(fā)送方的郵箱密碼,,不是登錄密碼,是qq的第三方授權登錄碼,要自己去開啟(之前叫你保存的那個密碼) $mail->SMTPSecure = "ssl"; // 使用ssl協(xié)議方式, $mail->Port = 465; // QQ郵箱的ssl協(xié)議方式端口號是465/587 $mail->setFrom("[email protected]","測試發(fā)件人"); // 設置發(fā)件人信息,如郵件格式說明中的發(fā)件人, $mail->addAddress($toemail,'測試收件人'); // 設置收件人信息,,如郵件格式說明中的收件人 $mail->addReplyTo("[email protected]","Reply"); // 設置回復人信息,,指的是收件人收到郵件后,如果要回復,,回復郵件將發(fā)送到的郵箱地址 $mail->Subject = "這是一個測試郵件"; // 郵件標題 $mail->Body = $body;// 郵件正文 $mail->CharSet = "UTF-8"; //字符集 $mail->Encoding = "base64"; //編碼方式 $mail->IsHTML(true); //支持html格式內(nèi)容 if(!$mail->send()){ // 發(fā)送郵件 echo "Message could not be sent."; echo "Mailer Error: ".$mail->ErrorInfo; // 輸出錯誤信息 }else{ echo ''; return '發(fā)送成功'; } } 發(fā)送成功之后,,郵件內(nèi)容,注意,,如果發(fā)送之后,,郵件內(nèi)容不能解析html代碼,需要添加支持html格式內(nèi)容 $mail->IsHTML(true);
驗證注冊激活賬戶 public function active() { $data = request()->param(); // 通過id找對應的激活碼 $active_key = Db::table('active')->where(['id'=>$data['id']])->value('active_key'); if ($active_key) { // 驗證激活碼是否正確 if ($active_key == $data['active_key']) { // 更改激活狀態(tài) $res = Db::table('active')->where(['id'=>$data['id']])->update(['status'=>1]); if ($res) { echo "激活成功"; }else{ echo "激活失敗"; } }else{ echo "激活碼不正確"; } }else{ echo "用戶不存在"; } } 這里只是簡單舉例,,安全性還不高,,可以對激活碼加密,添加激活碼的過期時間等提高安全性 |
|