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