前言
前面差不多把手机注册说的差不多了,这里我们来说说邮箱方面的知识。
在日常注册账号时我们都是输入邮箱后等待一段时间官方会给我们发送一件邮件,然后点里面的链接进行激活。
这里我们就来介绍怎么发送邮件,和点击链接进行激活。
发送邮件
首先在前端判断当前用户选择的是手机号注册还是邮箱注册。如果是邮箱验证再进行判断邮箱格式最后在通过ajax进行传送数据到服务端。
这里需要在数据表member中添加email和active项,还需创建一个temp_email表用来存放一些验证数据,具体类型设置如下图所示

然后在app\下新建Models文件夹 ,然后再在Models下新建M3Email.php
具体代码如下
<?php
namespace App\Models;
class M3Email {
//发送给多个人可以使用数组
public $from; // 发件人邮箱
public $to; // 收件人邮箱
public $cc; // 抄送
public $attach; // 附件
public $subject; // 主题
public $content; // 内容
}
接着还要在Tool下新建 UUID.php
这个我也不是太了解是干么的,大家可自行在百度里查阅相关资料
代码如下
<?php
namespace App\Tool;
class UUID {
static function create($prefix = '') {
$chars = md5(uniqid(mt_rand(), true));
$uuid = substr($chars,0,8);
$uuid .= substr($chars,8,4);
$uuid .= substr($chars,12,4);
$uuid .= substr($chars,16,4);
$uuid .= substr($chars,20,12);
return $prefix . $uuid;
}
}
接着需要你在你的邮箱开启smtp,pop3服务。我的是网易163邮箱,网上教程很多这里我就不说了。
我们这需要在.env和mail.php进行一些配置
.env

mail.php

发送邮件使用的是Laravel的Mail::send方法,具体用法请查阅Laravel文档
部分代码如下
//发送邮件
$uuid = UUID::create();//生成uuid
$m3_email = new M3Email();
$m3_email->to = $email;
$m3_email->cc = '18256929575@163.com';//抄送
$m3_email->subject = '邮箱验证';
$m3_email->content = '请于24小时内点击该链接完成验证。
http://127.0.0.1/laravel/public/service/validate_email'
. '?member_id=' . $member->id
. '&code=' . $uuid;
//将信息存放到数据表中
$tempEmail = new TempEmail();
$tempEmail->member_id = $member->id;
$tempEmail->code = $uuid;
$tempEmail->deadline =date('Y-m-d H-i-s',time()+24*60*60);
$tempEmail->save();
//use 的作用:由于function是闭包函数当我们需要使用外部变量的时候 我们需要通过使用use 才能将外部参数传进来
Mail::send('email_register', ['m3_email'=> $m3_email], function ($message) use ($m3_email) {
$message->to($m3_email->to,'尊敬的用户')
->cc($m3_email->cc)
->subject($m3_email->subject);
});
还需要在视图中新建email内容模板,具体如下图所示

这样邮件就可以发送了
效果图

大家如果看不懂,请点击这篇文章进行邮件发送测试http://laravelacademy.org/post/213.html
链接验证
首先我们要获取发送的邮件中包含的一些数据,然后通过数据库进行匹配验证。可能会出现,uuid没传过来,member_id没传过来,或者member_id不和数据库中的一样,或者链接已超时等等。如果成功就将active置为1,其实在我们注册账号时,点击验证链接后就会跳转到另一个页面。我们这没设置,大家有兴趣可以尝试一下
验证代码逻辑如下
//验证邮箱链接
public function validateEmail(Request $request){
//获取数据
$member_id = $request->input('member_id','');
$code = $request->input('code','');
if ($member_id == '' || $code==''){
return '验证异常';
}
$tempemail = TempEmail::where('member_id',$member_id)->first();
if ($tempemail == null){
return '验证异常';
}
if ($tempemail->code == $code){
if(time() > strtotime($tempemail->deadline)){ //strtotime将时间字符串转换为时间戳
return '该链接已失效';
}
$member = Member::find($member_id);
$member->active =1;
$member->save();
return redirect('login');
}
else{
return '该链接已失效';
}
}