摘要:我們稍微封裝下代碼吧請您激活賬戶方法用于保存或更新字段方法用于判斷是否在小時之內使用管理郵件在剛才的例子中,我們使用的是提供的方法來快速創建和發送郵件。
使用 Mailtrap 測試郵件功能
Mailtrap 提供了簡單的測試郵件的服務,步驟如下:
登錄網站 Mailtrap
注冊用戶
注冊成功之后,會自動創建一個 demo,點進去之后就可以看到配置信息
只需要把上面的信息配置到對應的 .env 中即可:
MAIL_DRIVER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME=fc0ad24e593f34 MAIL_PASSWORD=aef271516bc810 MAIL_ENCRYPTION=null
這樣,我們在應用里面發出去的郵件你都能在網站的 demo 中看到了。
用戶激活功能實現 用戶激活功能實現思路接下來談談要實現的用戶激活功能的基本過程:
創建數據表,保存用戶激活信息;
提供激活選項給登錄其未激活的用戶;
用戶點擊激活之后,生成一個唯一的秘鑰,保存到數據庫;同時將秘鑰以參數形式附在超鏈接的后面顯示在用戶郵箱正文中;
用戶在郵箱中點擊超鏈接,返回網站;
網站根據參數是否匹配以及是否過期(24小時)來判斷用戶是否激活成功;
創建數據表因為激活的功能并不常用,將其多帶帶放置于一張表中:
$ php artisan make:model UserActivation -m
編輯字段:
/database/migrations/2017_04_21_071142_create_user_activations_table.php public function up() { Schema::create("user_activations", function (Blueprint $table) { $table->integer("user_id")->unsigned()->primary(); $table->string("token")->unique(); $table->boolean("active")->default(0); $table->timestamps(); $table->foreign("user_id") ->references("id") ->on("users") ->onDelete("cascade"); }); }
執行:
$ php artisan migrate添加用戶表與用戶激活表的一對一關系
用戶表與用戶激活表為一對一關系:
/app/User.php public function activations() { return $this->hasOne(AppUserActivation::class); }
允許用戶激活表批量賦值:
/app/UserActivation.php protected $fillable= ["user_id","active","token"];添加激活選項
首先,讓登錄且未激活的用戶可以點擊「激活」按鈕:
/resources/views/layouts/nav.blade.php @if (Auth::check()) {{ Auth::user()->name }} 登出 @if (is_null(Auth::user()->activations) || Auth::user()->activations->active == 0) 發送激活郵件 @endif @else
路由指派該請求:
Route::get("/sendActivationMail","RegistrationController@send");
在實現具體的方法之前,我們先來介紹下如何快速發送郵件。
快速發送郵件先來看看 Laravel 提供的選項:
$message->from($address, $name = null); # 郵件的所有者 $message->sender($address, $name = null); # 郵件的實際傳輸人,若所有者與發送者為同一人,可省略 $message->replyTo($address, $name = null); # 作者建議回復的地址 $message->to($address, $name = null); # 收件人的地址 $message->cc($address, $name = null); # 收件人外,想讓其他知道該事的人的地址 $message->bcc($address, $name = null); # 不想讓 cc 的人看到你發送給了誰,那么就用 bcc $message->subject($subject); #主題 $message->priority($level); $message->attach($pathToFile, array $options = []);
注意,郵件的格式要遵守 RFC2822 規范,否則可能報錯。
from = "From:" mailbox-list CRLF sender = "Sender:" mailbox CRLF reply-to = "Reply-To:" address-list CRLF to = "To:" address-list CRLF cc = "Cc:" address-list CRLF bcc = "Bcc:" (address-list / [CFWS]) CRLF
我們舉一個簡單的例子:
public function send() { Mail::raw("test laravel blog email function",function ($message){ $from = ["From: from@qq.com","fromman"]; $to = ["To: to@qq.com","toman"]; $cc = ["Cc: cc@qq.com","ccman"]; $bcc = ["Bcc: bcc@qq.com","bccman"]; $replyTo = ["Reply-To: replyto@qq.com","replytoman"]; $sender = ["Sender: sender@qq.com","senderman"]; $subject = "Subject Subject"; $message->to($to) ->from($from) ->sender($sender) ->cc($cc) ->bcc($bcc) ->replyTo($replyTo) ->subject($subject); }); return redirect("/"); }
raw 方法發送純文本給對方。同時,我們在傳入的閉包函數中進行配置。在本例子中,將會給 toman、ccman 和 bccman 三個人一人發送一封純文本郵件,因此,我們在 Mailtrap 中會收到三封:
因為 bcc 是密送,所以發送給 ccman 的郵件中看不到 bccman :
在上述的配置字段中, from 字段以預先定義好,這樣就不需要每次都填寫了。當然,如果使用了 $message->from 方法,就會覆蓋配置。
/config/mail.php "from" => [ "address" => env("MAIL_FROM_ADDRESS", ""From: "demo@blog.com"), "name" => env("MAIL_FROM_NAME", "Zen"), ],激活功能實現
現在,我們實現可以發送激活郵件的功能了:
use AppUserActivation; public function send() { // 生成唯一 token $token = bcrypt(auth()->user()->email.time()); $user = auth()->user(); // 發送郵件 Mail::send("emails.activation", compact("user", "token"), function ($message) { $to = ["To: ".auth()->user()->email, auth()->user()->name]; $subject = "blog demo 請您激活賬戶"; $message->to($to) ->subject($subject); }); // 數據庫保存 token if ($user->activations){ $user->activations()->update(["token"=>$token]); } else { $user->activations()->save(new UserActivation([ "token" => $token ])); } // 發送并保存成功,跳轉到主頁 return redirect("/"); }
這次,我們使用的是 Mail::send 方法,該方法可以傳入視圖作為郵件內容,同時第二個參數里傳入給視圖的數據,接下來定義視圖:
/resources/views/emails/activation.blade.phpDocument 您好, {{ $user->name }} ! 請點擊下面鏈接完成注冊:
激活鏈接
用戶將會收到這樣的郵件:
點擊鏈接之后,會向網站發送請求,路由進行指派:
Route::get("/activeAccount","RegistrationController@active");
最后,判斷該 token 是否過期或者是否匹配,匹配則跳轉到登錄頁面,否則跳轉到主頁。
use CarbonCarbon; public function active() { $token = request("verify"); $rs = UserActivation::where("token", $token) ->whereBetween("updated_at", [Carbon::now()->subDay(), Carbon::now()]); if ($rs->exists()) { $rs->update(["active"=>true]); return redirect("/login"); } return redirect("/"); }
功能已經實現了。我們稍微封裝下代碼吧:
/app/Http/Controllers/RegistrationController.php public function send() { $token = bcrypt(auth()->user()->email.time()); $user = auth()->user(); Mail::send("emails.activation", compact("user", "token"), function ($message) { $to = ["To: ".auth()->user()->email, auth()->user()->name]; $subject = "blog demo 請您激活賬戶"; $message->to($to) ->subject($subject); }); $user->addActivationsData($token); return redirect("/"); } public function active() { $token = request("verify"); $rs = UserActivation::where("token", $token) ->notExpired(); if ($rs->exists()) { $rs->update(["active"=>true]); return redirect("/login"); } return redirect("/"); }
addActivationsData 方法用于保存或更新 $token 字段:
/app/User.php public function addActivationsData($token) { if ($this->activations) { $this->activations()->update(["token"=>$token]); } else { $this->activations()->save(new AppUserActivation([ "token" => $token ])); } }
notExpired 方法用于判斷 token 是否在 24 小時之內:
/app/UserActivation.php use CarbonCarbon; public function scopeNotExpired($query) { return $query->whereBetween("updated_at", [Carbon::now()->subDay(), Carbon::now()]); }使用 mailables 管理郵件
在剛才的例子中,我們使用的是 Mail 提供的方法來快速創建和發送郵件。實際上,Laravel 提供了管理不同類型郵件的方法。我們來快速了解下。
創建「歡迎」郵件類型首先,我們來創建一個用于歡迎新用戶的 mailables:
$ php artisan make:mail Welcome
首次使用時,會創建 app/Mail 目錄。接下來,我們就可以實現給用戶發送歡迎郵件的功能了。
首先,用戶注冊成功之后,發送一封歡迎郵件:
/app/Http/Controllers/RegistrationController.php use AppMailWelcome; public function store() { ... auth()->login($user); Mail::to($user)->send(new Welcome); return redirect()->home(); }
之前我們通過閉包的方式傳遞 from 、to 等字段,實際上,也可以直接將 $user 實例直接傳遞給 to,這樣會自動去識別 name 和 from 字段。然后,send 方法傳入 mailables 類即可。
配置 mailables如果使用 to($user) 可能會報錯,因為不符合我們之前說的 RFC2822 規范。
接下來,發送郵件的主要功能都可以在定義的 Welcome 類中實現了。
可以定義郵件的 blade 視圖:
/app/Mail/Welcome.php public function build() { return $this->view("emails.welcome"); }
顯示結果為:
也可以定義純文本視圖:
/app/Mail/Welcome.php public function build() { return $this->text("emails.welcome"); }
對應的視圖文件如下:
/resources/views/emails/welcome.blade.phpDocument {{$name}}, 歡迎成為 Blog Demo 的會員
可以配置郵件的各種信息,跟之前的方式類似:
public function build() { $from = ["From: from@qq.com","fromman"]; $to = ["To: to@qq.com","toman"]; $subject = "Subject Subject"; return $this->text("emails.welcome") ->to($to) ->from($from) ->subject($subject); }
可以傳遞變量給視圖,第一種是直接在 view 里面傳遞(也可以使用 with):
/app/Mail/Welcome.php public function build() { $from = ["From: from@qq.com","fromman"]; $to = ["To: to@qq.com","toman"]; $subject = "Subject Subject"; $user = auth()->user(); return $this->view("emails.welcome",compact("user")) ->to($to) ->from($from) ->subject($subject); } /resources/views/emails/welcome.blade.php{{$user->name }}, 歡迎成為 Blog Demo 的會員
另外一種方法是,在 Welcome 類中定義屬性類型為「公共的」。這樣該屬性就會自動傳遞給視圖:
/app/Http/Controllers/RegistrationController.php Mail::send(new Welcome); /app/Mail/Welcome.php public $user; public function __construct(User $user) { $this->user = $user; }
最后,我們還可以使用 Markdown 的語法來寫郵件:
$ php artisan make:mail MDWelcome --markdown="emails.md-welcome"
創建使用使用 --markdown 參數來生成對應的視圖即可。具體使用方法可以查看文檔。
參考資料:
RFC2822 中文文檔
Laravel 的 郵件發送功能 | Laravel 5.4 中文文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22824.html
摘要:本節內容比較簡單,之前我們使用方法來進行字段驗證,這樣做有一個不好的地方就是,如果你要在很多地方使用同樣的驗證,就需要重復編寫代碼。因此,提供另外一種方式來進行字段驗證,即請求類。 本節內容比較簡單,之前我們使用 validator 方法來進行字段驗證,這樣做有一個不好的地方就是,如果你要在很多地方使用同樣的驗證,就需要重復編寫代碼。因此,Laravel 提供另外一種方式來進行字段驗證...
摘要:本節將實現文章評論與用戶關聯的功能。關系定義首先修改與表,增加字段增加全部回滾并重新執行遷移添加用戶表與文章表評論表的一對多關系添加文章評論表與用戶表的多對一關系同時,評論表的字段增加。同時,我們還自定義了返回的錯誤信息。 本節將實現文章、評論與用戶關聯的功能。 關系定義 首先修改 posts 與 comments 表,增加 user_id 字段 /database/migratio...
摘要:將上述的一系列查詢進行封裝模型到了這一步,我們基本上實現了文章歸檔的功能。但是有一個問題,文章歸檔實際上包括在通用視圖中,這就意味著,網站的所有請求都需要返回,否則就會報錯。數據庫之數據庫請求構建器中文文檔的視圖功能中文文檔 首先,要實現的是按照日期來統計文章,原始的 SQL 如下: select year(created_at) year, monthname(c...
摘要:同時,傳入參數,即已存在的查詢。因此,更為常見的做法是在控制器中處理路由請求。 這一節,我們進一步完善上一節創建的任務列表。主要知識點: Eloquent Model 控制器 路由模型綁定 Eloquent Model 新增遷移 首先,我們為數據庫表 tasks 新增一個字段 completed,用來表示任務是否完成: $ php artisan make:migration ad...
摘要:它的目的是提供正確的方式進行頁面交互測試,所以可以使用去點擊按鈕或者鏈接填寫表單甚至拖放。此外,提到測試運行比更快。此次因底層架構改變較大而重命名。這個功能受到的啟發,能夠將元素簡化為可重用區域。 showImg(https://segmentfault.com/img/remote/1460000008212617); 轉自 Laravel 社區:https://laravel-ch...
閱讀 2164·2021-11-11 16:55
閱讀 1685·2019-08-30 15:54
閱讀 2817·2019-08-30 15:53
閱讀 2211·2019-08-30 15:44
閱讀 1152·2019-08-30 15:43
閱讀 965·2019-08-30 11:22
閱讀 1942·2019-08-29 17:20
閱讀 1566·2019-08-29 16:56