[Day 28] 建立注册的画面及功能(十二) - 寄出注册通知信

寄送会员通知信

Laravel基於SwiftMailer函式库开发了一套邮件套件,
可以支援多种服务,
在我们使用邮件功能之前,
要先安装Guzzle HTTP函式库.
(PHP必须在7.1.3以上)

composer require guzzlehttp/guzzle
https://ithelp.ithome.com.tw/upload/images/20201001/20105694WJqLH90AVf.png

邮件相关设定

邮件的设定放在config/mail.php档案中,我们使用Gmail SMTP来当作测试用的邮件服务,在.env的邮件设定如下

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD= (密码)
MAIL_ENCRYPTION=tls

如果要使用其他邮件服务,
除了设定config/mail.php档案,
服务相关的验证资料都放在config/services.php档案中,
必须要设定完後才可以正常使用,
在设定完Gmail SMTP相关设定後,
就可以开始测试寄送邮件了.

寄送会员通知信

原本正式的流程,
还要经过认证的过程,
不过我们在这里就直接省略,
直接寄E-mail通知就解决了.
我们可以使用Mail:send()的函式寄送邮件,
相关的程序如下:

必须要use Mail; //寄信 否则会出现错误 Class 'App\Http\Controllers\Mail' not found

app/Http/Controllers/UserAuthController.php

<?PHP
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Validator; //验证器
use Hash; //杂凑
use Mail; //寄信
use App\Shop\Entity\User; //使用者 Eloquent ORM Model

class UserAuthController extends Controller
{
    //处理注册资料
    public function signUpProcess()
    {
        //省略
        User::create($input);

        //寄送注册通知信
        $mail_binding = [
            'name' => $input['name']
        ];

        Mail::send('email.signUpEmailNotification', $mail_binding,
        function($mail) use ($input){
            //收件人
            $mail->to($input['email']);
            //寄件人
            $mail->from('[email protected]');
            //邮件主旨
            $mail->subject('恭喜注册Laravel部落格成功!');
        });

        //重新导向到登入页
        return redirect('/user/auth/sign-in');
    }
}
?>

在Mail::send()的第一个参数是寄送邮件药使用的邮件模板,
模板位置一样是放在resources/views目录下,
上面的范例则是使用resources/views/email/signUpEmailNotification.blade.php模板档案,
模板档案只显示使用者昵称,
并加入注册成功的相关字样而已.

第二个参数,
代表要传入到模板的变数资料,
在模板中我们有用name变数去显示使用者的昵称,
所以在模板变数资料,
需要将name资料传给模板.

resources/views/email/signUpEmailNotification.blade.php

<h1> 恭喜 {{ $name }} Laravel部落格 注册成功</h1>

第三个参数,为设定E-mail寄送的相关寄件人及收件人相关设定,像是寄件人、收件人及邮件主旨,当设定完成後就可以测试传送表单资料,看看是否有正确的收到寄送的注册通知信了!

执行 http://localhost:6943/user/auth/sign-up ,送出表单之後收邮件
https://ithelp.ithome.com.tw/upload/images/20201001/20105694wnLo6O0NWb.png

可以成功发送邮件了.

补充:目前app/Http/UserAuthController.php的完整程序码

<?PHP
namespace App\Http\Controllers;

use Mail;
use Hash;
use Validator;
use App\Http\Controllers\Controller;
use App\Module\ShareData;
use App\Entity\User;

class UserAuthController extends Controller
{
    //使用者注册画面
    public function signUpPage()
    {
        $name = 'sign_up';
        $binding = [
            'title' => ShareData::TITLE,
            'name' => $name,
        ];
        return view('user.sign-up', $binding);
    }

    //处理注册资料
    public function signUpProcess()
    {
        //接收输入资料
        $input = request()->all();

        //验证规则
        $rules = [
            //昵称
            'name' => [
                'required',
                'max:50',
            ],
            //帐号(E-mail)
            'account' => [
                'required',
                'max:50',
                'email',
            ],
            //密码
            'password' => [
                'required',
                'min:5',
            ],
            //密码验证
            'password_confirm' => [
                'required',
                'same:password',
                'min:5'
            ],
        ];

        //验证资料
        $validator = Validator::make($input, $rules);

        if($validator->fails())
        {
            //资料验证错误
            return redirect('/user/auth/sign-up')
                        ->withErrors($validator)
                        ->withInput();
        }

        $input['password'] = Hash::make($input['password']);

        User::create($input);

        //寄送注册通知信
        $mail_binding = [
            'name' => $input['name']
        ];

        Mail::send('email.signUpEmailNotification', $mail_binding,
        function($mail) use ($input){
            //收件人
            $mail->to($input['account']);
            //寄件人
            $mail->from('[email protected]');
            //邮件主旨
            $mail->subject('恭喜注册Laravel部落格成功!');
        });

        //重新导向到登入页
        return redirect('/user/auth/sign-in');
    }

    //使用者登入画面
    public function signInPage()
    {
        $name = 'sign_in';
        $binding = [
            'title' => ShareData::TITLE,
            'name' => $name,
        ];
        return view('user.sign-in', $binding);
    }

    //登出
    public function signOut()
    {
        //重新导向回灯入页
        return redirect('/user/auth/sign-in');
    }
}
?>

注册功能的总结

在会员注册功能这里,
我们花了很多时间,
详细介绍Laravel的许多相关功能,
很多以前要花不少时间来做的事情,
Laravel都已经帮我们做好了,
我们可以更专心地去构思及开发网站,
不用花太多繁复的时间在重复的事情上.
虽然30天已经快到了,
不过後面还会继续发,
希望能够将整个架构完整地补完.


<<:  建立香港Shopify网店需要思考的7个因素

>>:  [Day 29] 会员登入及登出(一)

Day21 X Upgrade Your HTTP Connection

其实很多的效能优化技巧都拥有「用了不一定会让效能变得比较快,就算有可能也是使用者难以感知的微幅进步...

Day 22 中断的运用

在Day 20有稍微提到中断机制,我们稍微深入说明一下,中断其实也是种不浪费资源的方式,如果处理器一...

安全功能(security function)

-治理结构 -波特的价值链 职能通过开展将输入转化为有用结果的活动来产生价值。一个组织通常由直线职...

AWS Academy LMS 申请开课 - 教师

AWS 所提供的 AWS Academy 教材可以透过 AWS Academy Learning M...

[30天 Vue学好学满 DAY24] Vue Router-3

router-link to 函数 指定导向,包含以下方法 <!-- 直接指定路径 -->...