我们做项目会遇到发邮件的需求,它通常用来实现用户的注册。
而邮件发送原理其实很简单,首先在自己邮箱账号方的邮件服务器开启POP3服务,这里以163邮箱为例子,如下图
获取第三方客户端的授权码,以上为了方便我用了以前截图展现,当然新浪邮箱开启POP3服务更容易,一步到位。
实现流程如下:
1、先改用户数据表
增加email,status(状态默认为0,1为已激活)和active_code(激活码)
2、下载PHPMailer,用php代码实现邮件发送
自行从网上PHPMailer,在同目录下创建一个eamil.php文件
email.php具体代码:
<?php
require './PHPMailer/class.phpmailer.php';
$mail = new PHPMailer();
/*服务器相关信息*/
$mail->IsSMTP(); //使用smtp方式发生邮件
$mail->SMTPAuth = true; //使用用户信息认证
$mail->Host = 'smtp.163.com';//设置发件箱的smtp邮件服务器地址
$mail->Username = 'phpresources';//用户名
$mail->Password = 'qazwsxedc123';//密码 此密码时第三方的客户端密码
/*内容信息*/
$mail->IsHTML(true);
$mail->CharSet ="UTF-8";
$mail->From = 'phpresources@163.com'; //发件箱
$mail->FromName ="he2019"; //发件人的昵称
$mail->Subject = '邮件发送使用phpmailer 主题'; //主题
$mail->MsgHTML('邮件发送使用phpmailer 正文');//具体邮件的正文
$mail->AddAddress('youyouxiang@163.com'); //给指定的用户发送邮件
$mail->AddAttachment("test.png"); //追加附件
$res = $mail->Send();
var_dump($res);
?>
访问该文件
完成,接下来把测试好的邮件发送导入到tp3项目中使用
1、把PHPMailer放在项目同级的目录,创建个邮件发送方法(最后是公共方法)
//发送邮件
function sendEmail($to,$Subject,$body)
{
require '../PHPMailer/class.phpmailer.php';
$mail = new PHPMailer();
/*服务器相关信息*/
$mail->IsSMTP(); //使用smtp方式发生邮件
$mail->SMTPAuth = true; //使用用户信息认证
$mail->Host = 'smtp.163.com';//设置发件箱的smtp邮件服务器地址
$mail->Username = 'phpresources';//用户名
$mail->Password = 'qazwsxedc123';//密码 此密码时第三方的客户端密码
/*内容信息*/
$mail->IsHTML(true);
$mail->CharSet ="UTF-8";
$mail->From = 'phpresources@163.com'; //发件箱
$mail->FromName ="金航商城管理员"; //发件人的昵称
$mail->Subject = $Subject; //主题
$mail->MsgHTML($body);//具体邮件的正文
$mail->AddAddress($to); //给指定的用户发送邮件
return $mail->Send();
}
2、写方法实现邮件发送
控制器操作方法
//实现用户使用邮箱进行注册
public function registbyemail()
{
if(IS_GET){
$this->display();
}else{
$username =I('post.username');
$password =I('post.password');
$email =I('post.email');
//实例化模型对象 调用方法入库
$model =D('User');
$res = $model->registbyemail($username,$password,$email);
if($res == -1){
$this->ajaxReturn('用户名重复');
}else if($res == -2){
$this->ajaxReturn('邮箱重复');
}
//发送邮件
//拼接具体的邮件内容中的连接地址
$link = 'http://demo.com'.U('active').'?user_id='.$res['user_id'].'&active_code='.$res['active_code'];
sendemail($email,'商城用户激活邮件',$link);
$this->ajaxReturn(array(‘’OK'));
}
}
控制器对应的模型方法
//实现用户使用邮箱进行注册
public function registbyemail($username,$password,$email)
{
//检查用户名是否可用
$info = $this->where("username = '$username'")->find();
if($info){
return -1;
}
//检查邮箱是否重复
$info = $this->where("email = '$email'")->find();
if($info){
return -2;
}
//生成盐
$salt=rand(100000,999999);
//生成双重MD5之后的密码
$db_password= md5(md5($password).$salt);
$data=array(
'username'=>$username,
'password' =>$db_password,
'salt'=>$salt,
'email'=>$email,
'status'=>0,
'active_code'=>uniqid(),//生成激活码
);
$user_id = $this->add($data);
$data['user_id']=$user_id;
return $data;
}
用户注册输入正确的邮箱就能发送邮件,因为项目要实现用户邮箱注册,注册成功后需用户回到自己邮箱点击激活,我们发送邮件拼接的链接地址$link的actice_code是激活码(是注册时生成存到数据库里),用户status为0,当用户点击邮箱激活码才能让用户登录,所以需要实现具体用户的激活的方法,用户激活后status为1可正常登录
//实现具体用户的激活
public function active()
{
$user_id = I('get.user_id');
$active_code = I('get.active_code');
$model =D('User');
$user_info = $model->where('id='.$user_id)->find();
if(!$user_info){
echo '参数错误';exit();
}
if($user_info['status']==1){
echo '已经激活';exit();
}
if($active_code != $user_info['active_code']){
echo '激活码错误';exit();
}
//修改用户的状态
$model->where('id='.$user_id)->setField('status',1);
$this->redirect("/User/login");
}