laravel發送激活郵件的思路和問題

運行環境

  1. Mac系統
  2. Mamp集成環境+php5.6
  3. laravel版本號爲5.1.46

發送激活郵件思路:

  1. 建立用戶激活表,用戶填寫註冊信息,完畢以後驗證註冊信息,經過後,將註冊信息保存在用戶表中。
  2. 產生一個惟一的token用戶驗證用戶激活信息。
  3. 將token拼接到用戶激活郵件的後面,並給用戶發送郵件。
  4. 將token值和用戶ID保存在用戶激活表中。
  5. 用戶登陸郵箱以後,點擊激活超連接,返回到註冊網站。
  6. 根據用戶傳入的參數和和激活狀態來判斷用戶是否已經激活成功。

具體的實現過程:

1. 建立用戶激活表

php artisan make:model App\\Http\\Models\\Common\\UserActivation -m
複製代碼

執行了上面的命令以後,能夠看到在app/Http/Models/Common目錄下面建立了UserActivation的文件,以及在data目錄下建立了數據遷移文件,顯示如圖:php

建立的model文件

在model文件中的最後有一個user方法,此方法是用來出來關聯關係的,既能夠根據user_activations表中的user_id來查詢出這個用戶的信息。html

數據遷移文件

注意在上面的遷移文件中,我在用戶激活表中添加一個外鍵'user_id',接下來執行數據遷移命令:laravel

php artisan migrate
複製代碼

這樣用戶激活表就已經建好了,下面處理用戶註冊信息填寫完畢後的邏輯。bash

2. 處理用戶註冊信息

在用戶填寫完註冊信息以後,須要對用戶添加的信息進行驗證,驗證經過以後才能寫入到數據表中。目前暫時假設都已經將用戶提交的信息能寫入到用戶表中,那麼咱們就須要修改保存用戶信息的方法,代碼以下:服務器

## App/Http/Controllers/Admin/UserController.php文件

/**
 * 存儲用戶註冊信息的方法
 */
public function store(UserPostRequest $request) {
    $data = $request->except('_token');
    $data['password'] = Crypt::encrypt($data['password']);
    $res = User::create($data);
    if($res) {
        $token = bcrypt( $res->email . time());
        # 發送郵件
        Mail::send( 'admin.email.test', [ 'user' => $result, 'token' => $token ], function ( $message ) use ( $result ) {
            $subject = '愛麗社區激活郵件';
            $message->to( $result->email )->subject( $subject );
        } );

        // 保存激活信息
        $addData = [
            'token' => $token,
            'user_id' => $result->id,
        ];

        $res = UserActivation::create($addData);
        if ($res) {
            return redirect( 'admin/user' );
        } else {
            return back()->with('errors', 'userActivation表數據填充失敗!');
        }
    } else {
        return back()->with('errors', 'user表數據填充失敗!');
    }
}
複製代碼

如今能夠註冊一個用戶,並填寫郵箱,能夠看到已經發送了一個激活郵件到註冊郵箱中,顯示如圖:閉包

激活郵件

固然在這裏,我使用laravel自帶的發送郵件的API,使用時須要先配置好郵件的配置項,詳情見在 Laravel 5.1 中使用SMTP驅動實現郵件發送(含附件和圖片)詳細教程app

3. 在路由中配置驗證的路由並添加驗證的控制器和方法

如今須要在route.php文件中添加驗證路由:函數

Route::get('verify/account', 'Home\VerifyController@account');
複製代碼

在命令行中執行建立控制器的命令:post

php artisan make:controller Home/VerifyController --plain
複製代碼

在驗證激活郵件的控制器中添加account方法:網站

# App/Http/Controllers/Home/VerifyController.php文件
/**
 * 驗證激活郵件的方法
 */
public function account()
{
    $token = request( 'verify' );
    $res = UserActivation::where('token', $token)->where('active', 0)->whereBetween('updated_at', [Carbon::now()->subDay(), Carbon::now()])->first();
    if ($res) {
        $res->update(['active'=>1]);
        return redirect('/login');
    }

    return redirect('/');
}
複製代碼

如今註冊用戶時發送激活郵件和

發送用戶激活郵件時遇到的問題

1. 閉包函數內沒法使用外部的變量

使用郵件發送函數時,由於有閉包函數,因此沒法使用到外部的變量,以前的寫法,代碼以下所示:

Mail::send('admin.email.send', ['user'=>$result,'token'=>$token], function($message) {
    $subject = '愛麗社區激活郵件';
    $message->to( $result->email )->subject($subject);
});
複製代碼

PHPstorm提示的錯誤信息

可是這樣的寫法在執行的時候出現了錯誤,如圖:

提示未定義的變量

通過搜索以後,找到了正確的寫法:

Mail::send('admin.email.send', ['user'=>$result,'token'=>$token], function($message)  use ($result) {
    $subject = '愛麗社區激活郵件';
    $message->to( $result->email )->subject($subject);
});
複製代碼

如今能夠看到PHPstorm中也沒有錯誤信息,並且也能發送郵件信息。

PHPstorm也不提示錯誤信息

2. 發送郵件時須要等待的時間比較長

在註冊信息提交完畢以後,系統會給註冊用戶的郵箱中發送一份郵件,這2個過程是同步進行的,致使響應時間比較長,因此須要解決這個問題(能夠參考隊列的方式),下篇文章中再處理這個響應時間過長的問題。

總結

  1. 閉包函數內使用外部變量時須要使用use關鍵詞引入外部變量
  2. 註冊系統提交完畢以後,服務器響應的時間比較長,準備採用隊列的方式進行處理。
相關文章
相關標籤/搜索