之前用PHP+Mysql+jQuery结合ThinkPHP做了一个用户验证邮箱找回密码功能《ThinkPHP之PHP+Mysql+jQuery发送邮箱找回密码》,现在分享一下用CI框架结合PHPmailer发送QQ邮箱找回密码功能。
首先开启 php.ini 的extension=php_openssl.dll && extension=php_sockets.dll;
然后开启 smtp服务器 认证邮箱的smtp功能; 我用的163邮箱,也可以用QQ邮箱,这个自己选择。
开启163smtp功能,登录163邮箱,找到“设置”,如图:
开启QQsmtp功能,登录QQ邮箱,找到“设置”,如图:
下载PHPmailer解压到/application/libreries/目录下重命名为PHPmailer,如图:
下载地址: github的phpmailer下载库。
主要用到这两个文件:
在libraries下新建文件mailer.php;
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框架发送邮件找回密码的功能已经实现了,至于重置密码就不演示了,以上内容希望对在这方面有问题的同行们有所帮助,
本文属原创内容,为了尊重他人劳动,转载请注明本文地址: