【Laravel】パスワードリセットのメールをカスタマイズしたい

Laravel

Laravelでの開発で便利なところとして、認証機能を作成してくれる機能があり、ログインだけでなくパスワードリセットの機能もコマンドを叩くだけで構築してくれます。

ただ、メールに送られてくる文章がHTMLの形式となり、よりシンプルなテキストメールにしたく、今回実装しましたのでその方法を紹介します。

今回はテキストですが、bladeファイルで作成しているため、お好みのHTML 形式のメールも送ることができます。

※前提条件
・Laravel8で再現しました。
・メールは既に送信できる状況になっているとします。メール送信の環境設定はこの記事では範囲外となります。

ファイルを作成する

artisanコマンドを叩いてファイルを作ります。

$ php artisan make:notification PasswordResetUserNotification

モデルに記述

ユーザーを管理しているモデル(デフォルトだと、Userでしょうか)で以下を記述して、オーバーライドできるようにします。
app/NotificationsのところにPasswordResetUserNotification.phpが作成されます。

    public function sendPasswordResetNotification($token): void
    {
        $this->notify(new  \App\Notifications\PasswordResetUserNotification($token));
    }

PasswordResetUserNotification.phpを編集する

トークンを受け取れるようにします。(パスワード再作成のリンク作成時に必要)

    private string $token;
    
        public function __construct(string $token )
    {
      $this->token = $token;
    }

同じファイル内で別クラスを作ります。一番下に配置しました。

class BareMail extends Mailable {
    use Queueable, SerializesModels;
    public function build() {}
}

vender内のResetPassword.phpファイル内にあるtoMailメソッドをオーバーライドして以下のように書きます。(ここはご自身のDB構造を見ながら変えていって下さい)

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($request)
    {
        $url = urldecode(url('password/reset', $this->token . '?email=' . $request->mail));//パスワードリセットリンクを作る(ここはDBの構造によります)
            return (new BareMail)
			->to($request->mail)//送り先のメールアドレスがあるカラムを指定
			->subject('【' . config('app.name') . '】パスワード再設定')
			->text('emails.passwordreset', ['reset_url' => $url]);//bladeのファイルを指定
    }

Mailableを継承していますので、to()やsubject()やtext()が使えることができます!

bladeファイルを用意する

今回だと以下のように作成しました。

resources/views/emails/passwordreset.blade.php



下記URLより、パスワードの再設定をお願いいたします。
このURLの有効期限は、本メールが送信されてから60分間です。

------------------------------------------------------------
URL:  {{$reset_url}} 
------------------------------------------------------------

ちなみに、Laravel標準のHTMLを使いたい場合は、以下のように書くとコンポーネントを継承できます。

@component('mail::message')


@component('mail::button', ['url' => $reset_url])

@endcomponent


@endcomponent

まとめ

これで、メールを送ることができると思います。

元々venderにある記述をオーバーライドして、独自のbladeを使っていく、という流れになりますね。

こちらの記事を参考にさせていただきました。

Laravelのパスワード再設定のメールをカスタマイズする - Qiita
これはなに公式ドキュメントには手順として簡単なものしかなかったためLaravelのパスワードリセットのカスタマイズについてメモします。ResetPasswordNotification.php…

LaravelのNotificationでテキスト(平文)メールを送信したい – helog
Laravelで通知メールを送信するしくみとしてNotificationクラスがありますが、それでテキスト(平文)メールを送る方法です。Notificationは非常に便利で、通知メールを送るための各機能が用意されています。但し、基本的に送信するメールタイプはHTMLメー...

コメント

タイトルとURLをコピーしました