发送邮件与邮箱验证登录

发送邮件

  1. 配置qq邮件

qq邮箱设置->账户 SMTP部分设置获取授权码。

  1. 修改配置文件, 本地 .env, 线上 config/mail.php
  1. // 以.env文件为例子
  2. MAIL_DRIVER=smtp
  3. MAIL_HOST=smtp.qq.com
  4. MAIL_PORT=25
  5. MAIL_USERNAME=sunvdong@qq.com
  6. MAIL_PASSWORD=nvmbsljczthocbde // 第一步获取的收取吗
  7. MAIL_ENCRYPTION=tls
  8. MAIL_FROM_ADDRESS=sunvdong@qq.com
  9. MAIL_FROM_NAME=孙维栋
  1. 生成发送邮件的类
    php artisan make:mail RegMail
class RegMail extends Mailable{
    ...

    // 主要写发送邮件的方法
    public function build()
    {
        // mail.reg 为邮件内容的视图 resources/views/mail/reg.blade.php
        return $this->view('mail.reg');

        // 设置主题等
        //->from('hello@app.com', 'Your Application')
        // ->subject('Event Reminder: ' . $this->event->name)
        // ->view('emails.reminder')
        // ->with(['title' => $this->event->name]);
    }
}
  1. 测试发送
// 
$user = User::find(1);
# 发送验证邮箱的邮件
\Mail::to($user)->send(new RegMail($user));

邮箱验证逻辑

  1. 注册账户状态未验证,生成唯一token -> 发送邮件,邮件内容一个附带token的链接
  2. 点击链接,根据token,找到用户,修改状态,自动登录
  3. 核心代码
// 注册
public function store(Request $request)
{
    $data = $this->validate($request, [
        'name' => 'required|min:4',
        'email' => 'required|unique:users|email',
        'password' => 'required|min:6|confirmed'
    ]);
    $data['password'] = bcrypt($data['password']);
    # 注册用户
    $user = User::create($data);
    # 发送验证邮箱的邮件
    \Mail::to($user)->send(new RegMail($user));
    session()->flash('success', '成功,请登录邮箱验证邮件');
    return redirect()->route('home');
}

//邮箱链接 reg.blade.php

<a href="{{route('confirmEmailToken',$user['email_token'])}}">激活账户</a>

// 验证
public function confirmEmailToken($token)
{
    $user = User::where('email_token', $token)->first();
    if ($user) {
        $user->email_active = true;
        $user->save();
        auth()->login($user);
        session()->flash('验证成功');
        return redirect('/');
    }

    session()->flash('danger', '邮箱验证失败');
    return redirect('/');
}