[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
MAIL_USERNAME=henrychang0202@gmail.com
MAIL_PASSWORD= (密碼)
MAIL_ENCRYPTION=tls

如果要使用其他郵件服務,
除了設定config/mail.php檔案,
服務相關的驗證資料都放在config/services.php檔案中,
必須要設定完後才可以正常使用,
在設定完Gmail SMTP相關設定後,
就可以開始測試寄送郵件了.

寄送會員通知信

原本正式的流程,
還要經過認證的過程,
不過我們在這裡就直接省略,
直接寄E-mail通知就解決了.
我們可以使用Mail:send()的函式寄送郵件,
相關的程式如下:

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('henrychang0202@gmail.com');
            //郵件主旨
            $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('henrychang0202@gmail.com');
            //郵件主旨
            $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天已經快到了,
不過後面還會繼續發,
希望能夠將整個架構完整地補完.