有些網站在注冊的時候,會向用戶的郵箱發送郵件,點擊郵件中的鏈接激活賬戶,基本原理就是在注冊的時候(即點擊發送郵件的時候),先把用戶的資訊存進資料庫,另外還有一個激活狀態的欄位(默認是未激活)點擊郵件中的鏈接,驗證通過之后,該欄位狀態會改為已激活,郵件中的鏈接資訊包括:用戶id(只要是在資料庫中能找到對應的資料就行,不一定是id),激活碼,點擊這個鏈接之后,會把這些資料傳到我們寫好的一個方法里面,只要在這個方法里面驗證即可,
業務流程
1、用戶提交注冊資訊
2、寫入資料庫,此時賬號未激活
3、將用戶名密碼或其他標識字符進行加密構成激活碼
4、將激活碼和用戶的id組成URL發送到郵箱
5、用戶登陸郵箱,點擊URL激活
6、驗證激活碼,正確就激活賬號,更改激活狀態
資料庫設計

發送郵件
發送郵件之前需要加載phpemailer類,可以看我上一篇文章Thinkphp5+PHPMailer實作發送郵件
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='https://www.cnblogs.com/zxf100/p/".$active_url."' target= '_blank'>點擊激活</a><br/> 如果以上鏈接無法點擊,請將它復制到你的瀏覽器地址欄中進入訪問,該鏈接24小時內有效,"; $mail=new Phpmailer(); $mail->isSMTP(); // 使用SMTP服務(發送郵件的服務) $mail->CharSet = "utf8"; // 編碼格式為utf8,不設定編碼的話,中文會出現亂碼 $mail->Host = "smtp.qq.com"; // 發送方的SMTP服務器地址 $mail->SMTPAuth = true; // 是否使用身份驗證 $mail->Username = "[email protected]"; // 申請了smtp服務的郵箱名(自己的郵箱名) $mail->Password = "xxxx"; // 發送方的郵箱密碼,不是登錄密碼,是qq的第三方授權登錄碼,要自己去開啟(之前叫你保存的那個密碼) $mail->SMTPSecure = "ssl"; // 使用ssl協議方式, $mail->Port = 465; // QQ郵箱的ssl協議方式埠號是465/587 $mail->setFrom("[email protected]","測驗發件人"); // 設定發件人資訊,如郵件格式說明中的發件人, $mail->addAddress($toemail,'測驗收件人'); // 設定收件人資訊,如郵件格式說明中的收件人 $mail->addReplyTo("[email protected]","Reply"); // 設定回復人資訊,指的是收件人收到郵件后,如果要回復,回復郵件將發送到的郵箱地址 $mail->Subject = "這是一個測驗郵件"; // 郵件標題 $mail->Body = $body;// 郵件正文 $mail->CharSet = "UTF-8"; //字符集 $mail->Encoding = "base64"; //編碼方式 $mail->IsHTML(true); //支持html格式內容 if(!$mail->send()){ // 發送郵件 echo "Message could not be sent."; echo "Mailer Error: ".$mail->ErrorInfo; // 輸出錯誤資訊 }else{ echo ''; return '發送成功'; } }
發送成功之后,郵件內容,注意,如果發送之后,郵件內容不能決議html代碼,需要添加支持html格式內容 $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']) { // 更改激活狀態 $res = Db::table('active')->where(['id'=>$data['id']])->update(['status'=>1]); if ($res) { echo "激活成功"; }else{ echo "激活失敗"; } }else{ echo "激活碼不正確"; } }else{ echo "用戶不存在"; } }
這里只是簡單舉例,安全性還不高,可以對激活碼加密,添加激活碼的過期時間等提高安全性
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61847.html
標籤:PHP
上一篇:Laravel 7.4 發布
下一篇:php實作不能同時登陸
