以前用PHP+Mysql+jQuery結合ThinkPHP作了一個用戶驗證郵箱找回密碼功能《ThinkPHP之PHP+Mysql+jQuery發送郵箱找回密碼》,如今分享一下用CI框架結合PHPmailer發送QQ郵箱找回密碼功能。php
首先開啓 php.ini 的extension=php_openssl.dll && extension=php_sockets.dll;css
而後開啓 smtp服務器 認證郵箱的smtp功能; 我用的163郵箱,也能夠用QQ郵箱,這個本身選擇。html
開啓163smtp功能,登陸163郵箱,找到「設置」,如圖:git
開啓QQsmtp功能,登陸QQ郵箱,找到「設置」,如圖:程序員
下載PHPmailer解壓到/application/libreries/目錄下重命名爲PHPmailer,如圖:github
下載地址: github的phpmailer下載庫。sql
主要用到這兩個文件:服務器
在libraries下新建文件mailer.php;app
defined('BASEPATH') OR exit('No direct script access allowed'); class Mailer{ function sendMail($emailsubject,$emailbody,$smtpemailto){ include_once("PHPMailer/class.smtp.php"); // 引入php郵件類 include_once("PHPMailer/class.phpmailer.php"); // 引入php郵件類 $mail= new PHPMailer(); $mail->CharSet = "utf-8"; // 編碼格式 $mail->IsSMTP(); $mail->SMTPAuth = true; // 必填,SMTP服務器是否須要驗證,true爲須要,false爲不須要 $mail->Host = "smtp.163.com"; // 必填,設置SMTP服務器 $mail->Port = 465; // 設置端口 $mail->Username = "開啓smtp服務的郵箱帳戶"; // 必填,開通SMTP服務的郵箱; $mail->Password = "開啓smtp服務的郵箱密碼"; // 必填, 以上郵箱對應的密碼 $mail->SMTPSecure = 'ssl'; //傳輸協議 $mail->From = "發件人郵箱"; // 必填,發件人Email $mail->FromName = "luokakale"; // 必填,發件人暱稱或姓名 $mail->Subject = $emailsubject; // 必填,郵件標題(主題) $mail->MsgHTML($emailbody); //郵件內容 $mail->AddReplyTo($smtpemailto); // 收件人回覆的郵箱地址 $mail->AddAddress($smtpemailto); // 收件人郵箱 $mail->IsHTML(true); // 是否以HTML形式發送,若是不是,請刪除此行 if(!$mail->Send()) { echo "發送失敗: " . $mail->ErrorInfo; } else { echo '系統已向您的郵箱發送了一封郵件<br/>請登陸到您的郵箱及時重置您的密碼!'; } } }
注意:若是協議是ssl 則端口爲465;若是是tsl則是25。框架
接下來就是本身進行郵箱驗證的步驟了,以上代碼裏面的參數不懂先不用管,一會再解釋。
首先確定要有一個找回密碼填寫郵箱的界面,上圖:
對應的程序以下:
1 <form id="two"> 2 <ul> 3 <li> 4 <img src="public/images/password.png"/> 5 <label>郵箱</label> 6 <input type="text" placeholder="請輸入郵箱" id="password"/> 7 </li> 8 </ul> 9 <input type="button" value="發送郵件" id="sendEmail"/> 10 </form>
樣式我就不寫了,本身寫就好了,這不重要:
而後還要進行一些郵箱驗證,我用的jQuery和Ajax還有最喜歡的layer插件來進行郵箱驗證以及傳遞數據
1 $('#two input').eq(0).blur(function () { 2 var preg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/; 3 if ($(this).val().length == 0) {//沒填寫郵箱 4 layer.msg('郵箱不能爲空') 5 } else if (!preg.test($(this).val())) {//郵箱格式驗證 6 layer.msg('郵箱格式不正確') 7 } else {//獲取用戶填寫的郵箱經過Ajax異步請求服務器 8 var email = $('#two input').eq(0).val(); 9 $("#sendEmail").attr("disabled","disabled").val('提交中..').css("cursor","default"); 10 $.post("<?php echo base_url('FindpwdController/EmailVerify')?>",{mail:email},function(msg){ 11 if(msg=="noreg"){//若是返回 'noreg' 12 layer.msg('該郵箱還沒有註冊') 13 $("#sendEmail").removeAttr("disabled").val('提 交').css("cursor","pointer"); 14 }else{ 15 $("#demo").html("<h3>"+msg+"</h3>"); 16 } 17 }); 18 } 19 })
以上jQuery代碼不是很難,相信只要學過一點jQuery的程序員們都能看懂的吧,接下來在controller接收請求處理數據,而後加載mailer類並調用sendMail方法,代碼以下:
1 //郵箱驗證 2 public function EmailVerify(){ 3 $email = $this->input->post('mail');//接收Ajax傳遞的參數 4 $this->db->select('member_id,member_name,member_pwd');//進行郵箱驗證 5 $sql = $this->db->get_where('ecshop_member',"member_email='$email'")->row_array(); 6 $id = $sql['member_id']; 7 if(!$id){//該郵箱還沒有註冊! 8 echo 'noreg'; 9 exit; 10 }else{ 11 $getpasstime = time(); //獲取當前時間 12 $uid = $sql['member_id'];//用戶id 13 $token = md5($uid.$sql['member_name'].$sql['member_pwd']);//組合驗證碼 14 $smtpemailto = $email; //收件人郵箱 15 $url = "http://www.msku.com/index.php/Home/Email/resetPwd?email=".$email." 16 &token=".$token;//構造重置密碼地址的URL 17 $time = date('Y-m-d H:i');//構造時間 18 $emailsubject = "www.ci.com - 找回密碼";//郵件主題 19 $emailbody = "親愛的".$email.":<br/>您在".$time."提交了找回密碼請求。請點擊下面的連接重置密碼 20 (按鈕24小時內有效)。<br/><a href='".$url."'target='_blank'>".$url."</a>"; //郵件內容 21 //加載Mailer類調用sendMail方法傳參 22 $this->load->library('Mailer'); 23 $this->mailer->sendMail($emailsubject,$emailbody,$smtpemailto); 24 //更新數據時間 25 $addtime['member_addtime'] = $getpasstime; 26 $this->db->update('member',$addtime,"member_id=$uid"); 27 } 28 }
結合上面的mailer類裏面的三個參數,就差很少作好了,解釋一下這三個參數。$emailsubject指的是發送郵件的主題,$emailbody指的是郵件內容在這裏我寫的內容是用戶收到的郵件重置密碼的連接,$smtpmailto指的是收件人的郵箱,在這裏就是用戶註冊時填寫的郵箱帳號。再試一下,成功收到郵件:
用CI框架發送郵件找回密碼的功能已經實現了,至於重置密碼就不演示了,以上內容但願對在這方面有問題的同行們有所幫助,
本文屬原創內容,爲了尊重他人勞動,轉載請註明本文地址: