Laravelでは登録時や、好きなタイミングでメールを送ることができます。
今回はユーザーが登録したときに確認メールを送り、ユーザーがメール内のボタンをクリックするとログインできる仕組みの作り方を解説します。
Laravelのバージョンは8、CSSフレームワークはBootstrapを使っています。
Laravelで登録ユーザーに確認メールを送信しする方法 【Email Verification】
まずはLaravelからメールを送信する設定を.envファイルにいれておきましょう。
.envファイルの設定
入力、変更すべき点は、下記のとおりです。
わたしは XServerを使用しているため、Xserverを基準に解説させてもらってます。
Mail_HOST | XServerなら【メールアカウント設定】の【送信メール(SMTP)サーバー】。svで始まる。 |
---|---|
Mail_USERNAME | xserverに設定したメール |
Mail_PASSWORD | 上記に設定したパスワード |
Mail_FROM_ADDRESS | From欄のアドレス。
MAIL_USERNAMEと同じでもOK |
Mail_FROM_NAME | From欄の名前。デフォルトのままだと .envファイルの1行目に書いたアプリの名前になる。 |
Mail_ADMIN | お問い合わせ時に管理者側に送信されるアドレス。なくてもよいが、作っておくと便利。Mail_USERNAMEと同じでもOK |
Userモデルファイルの編集
userモデルファイルを開きます。
namespace宣言の後、下記の3つが入っていることを確認してください。
1 2 3 4 5 |
use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; |
その下の部分には、下記を設定します。
1 2 3 4 5 6 |
class User extends Authenticatable implements MustVerifyEmail { use Notifiable; // ... } |
ただLaravel8ではほとんど最初から入っていました。
新たに追加した部分は、下記の黄色の部分だけであったような。
記憶違いでしたらごめんなさい!
ルートファイルに追加
ルートファイルweb.phpにデフォルトで入っている Auth::routes(); を無効にし、下記を追加します。
1 |
Auth::routes(['verify' => true]); |
ルートファイルを編集
このままだと、きちんとメールを確認していないユーザーもサイトの中を見れてしまいます。
次のようにverifiedミドルウェアを使って既存のルート設定を囲むと、メール確認済みのverifiedユーザー以外は各ルートにアクセスできなくなります。
1 2 3 4 5 |
Route::middleware(['verified'])->group(function(){ ★ログイン後のルート設定★ }); |
verify済みではないユーザーがログイン後の画面を見ようすると、「Verify Your Email Address (メールをご確認ください) 」という画面が表示されます。
この画面は、resources/views/auth の中のverify.blade.php ファイルになります。
このファイルは英語なので、もし日本語にしたい場合は翻訳しておきましょう。
私は下記のように翻訳しました。
【英語版】
【日本語版】
【日本語版コード】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">{{ __('メールアドレスをご確認ください') }}</div> <div class="card-body"> @if (session('resent')) <div class="alert alert-success" role="alert"> {{ __('ご登録いただいたメールアドレスに確認用のリンクをお送りしました。') }} </div> @endif {{ __('メールをご確認ください。') }} {{ __('もし確認用メールが送信されていない場合は、下記をクリックしてください。') }}, <form class="d-inline" method="POST" action="{{ route('verification.resend') }}"> @csrf <button type="submit" class="btn btn-link p-0 m-0 align-baseline">{{ __('確認メールを再送信する') }}</button>. </form> </div> </div> </div> </div> </div> @endsection |
これで、エラー画面が次のように日本語になります。
実験してみる
ここまでで設定完了。
このあとは、実際に登録をしてみます。
フォームに入力すると、下記画面が表示されます。
同時にメールが送信されます。
リンクをクリックすると、ログインできます。
ただこのままでは、メールが英語のまま。
もうひと頑張りして、メールを英語にしていきましょう。
メールを日本語にしたり、カスタマイズするには2つ方法があります。
どちらかお好きなほうを選んでくださいね。
【手っ取り早く翻訳】
【Notificationsを使って翻訳】