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を使っていく、という流れになりますね。
こちらの記事を参考にさせていただきました。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9TGFyYXZlbCVFMyU4MSVBRSVFMyU4MyU5MSVFMyU4MiVCOSVFMyU4MyVBRiVFMyU4MyVCQyVFMyU4MyU4OSVFNSU4NiU4RCVFOCVBOCVBRCVFNSVBRSU5QSVFMyU4MSVBRSVFMyU4MyVBMSVFMyU4MyVCQyVFMyU4MyVBQiVFMyU4MiU5MiVFMyU4MiVBQiVFMyU4MiVCOSVFMyU4MiVCRiVFMyU4MyU5RSVFMyU4MiVBNCVFMyU4MiVCQSVFMyU4MSU5OSVFMyU4MiU4QiZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9YmViZmI0ODM0NzlkZDk5Y2RjNmM1NWU1YTgwYTc5NzM&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBnY2NoYWFuJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz1jZTk4ZWFjM2E4NjhhOGI5MjdhYzlkZjk0ZmYyNDMwOA&blend-x=142&blend-y=436&blend-mode=normal&txt64=aW4g44Oq44OT44Oz44O744OG44Kv44OO44Ot44K444O844K65qCq5byP5Lya56S-&txt-width=770&txt-clip=end%2Cellipsis&txt-color=%23212121&txt-font=Hiragino%20Sans%20W6&txt-size=36&txt-x=156&txt-y=536&s=d0b8dae8f8e5f3181e9d452248013284)
![](https://kyotoprogramminglab.com/wp-content/uploads/cocoon-resources/blog-card-cache/ed23be7a8b11df836185fa6292ae17cc.png)
コメント