一、Introduction
需求是用户在注册时填写email,注册后,需要到邮箱验证后才能登陆。
二、实现
验证流程,注册成功后,为用户生成一个验证码;将验证码以连接方式发到用户邮箱;用户点击连接将验证码发回网站;网站验证这个验证码是否是为这个用户生成的验证码;帐号需要在24小时内验证,否则帐号失效。
1. 准备工作
需要添加phpMailer类来发邮件。下载phpMailer,然后解压到项目根目录下。
发邮件使用smtp协议,端口是25;收邮件,使用pop3协议,端口号是110。还需要一台邮件服务器。可以自己搭建,也可以使用第三方的。使用第三方的邮件服务器需要在第三方注册一个帐号。登陆开启smtp协议。
在config.php中配置邮箱相关的信息。
'EMAIL' => array(
'host' => 'smtp.163.com',
'user' => 'youxiangzhanghao',
'password' => 'password', //此处的密码为user邮箱在开启smtp时设置的授权密码。
),
2. 创建用于发送邮件的公用方法
/**
* 发送邮件的方法
*/
functionsendMail($to, $title, $content)
{
require_once('./PHPMailer-5.2.14/class.smtp.php');
require_once('./PHPMailer-5.2.14/class.phpmailer.php');
$mail = new PHPMailer();
//设置为发送邮件
$mail->IsSMTP();
//是否允许发送html代码为邮件内容
$mail->IsHTML(true);
$mail->CharSet = 'utf-8';
//是否需要身份验证
$mail->SMTPAuth = true;
//邮件服务器的帐号信息
$mailConfig = C('EMAIL');
$mail->From =$mailConfig['user'].'@163.com';
$mail->FromName =$mailConfig['user'];
$mail->Host = $mailConfig['host'];
$mail->Username = $mailConfig['user'];
$mail->Password =$mailConfig['password'];
//发邮件的端口号
$mail->Port = 25;
//收件人
$mail->AddAddress($to);
//邮件标题
$mail->Subject = $title;
//邮件内容
$mail->Body = $content;
return($mail->send());
}
在控制器的首页方法中测试
//测试发送邮件
var_dump(sendMail('haha@163.com','phptestemail', '<a href="http://www.phptest.com">hahahah</a>'));
3. 修改会员表,添加email字段和验证码字段
email varchar(150) not null comment '邮箱',
email_chkcode char(32) not null default '' comment '邮箱验证码',
email_chkcode_time int unsigned not null comment '邮箱验证码生成时间',
key email_chkcode(email_chkcode)
4. 修改注册,必须填email
修改注册表单,添加email字段;修改member模型,允许插入email字段,并增加email字段为email的验证规则。
5. 注册之前生成email验证码
在_before_insert()方法中
//生成email验证码