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を使っていく、という流れになりますね。
こちらの記事を参考にさせていただきました。
コメント