質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

1649閲覧

Laravel メールアドレス変更時にメール確認をしたい

kriht

総合スコア26

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

2クリップ

投稿2019/03/01 16:38

ユーザーが登録メールアドレスを変更した際、メール確認を行いたいです。
Laravel 5.7 を使用しています。

認証メールが送信されず困っています。またセキュリティ等に問題があれば、ご指摘頂きたいです。

登録したメールアドレス宛に送られた認証リンクを踏んで、仮登録から本登録にする機能です。

以下、考えた流れです。(4)(5)はイベント経由で処理します。

変更時の処理の流れ
(1) フォームからパスワードと新メールアドレスをPOST(パスワードが正しければ処理)
(2) usersテーブルの email_verified_at カラムを null にする(仮登録状態に)
(3) usersテーブルの email カラムを変更し保存
(4) 新メールアドレス宛に確認メールを送信(登録時のメール確認と同じ処理)
(5) 旧メールアドレスに変更を通知

リスナのhandleメソッドは、以下を参考にしました。Illuminate/Auth/Listeners/SendEmailVerificationNotification
SendEmailVerificationNotification.php

問題点
新メールアドレス宛に確認メールが送信されない。

フォームがPOSTされた際のアクション

PHP

1public function change_email(Request $request) 2{ 3 /** 4 * バリデーションなど 5 */ 6 $user = $request->user() 7 8 DB::transaction(function () use($user, $request){ 9 //現在のメールアドレス 10 $registered_email = $user->email; 11      //新しいメールアドレスがPOSTされたら 12 if($registered_email !== $request->input('email')){ 13 //仮登録状態にする 14 $user->email_verified_at = null; 15 $user->email = $request->input('email'); 16 $user->save(); 17  //メールアドレス変更イベントを発火 18 event(new ChangeEmailEvent($user, $registered_email)); 19 } 20 }); 21 return redirect('/'); 22}

イベント

PHP

1class ChangeEmailEvent 2{ 3 /** 4 *  一部省略 5 */ 6 public $user; 7 public $registered_email; 8 9 public function __construct(User $user, string $registered_email) 10 { 11 $this->user = $user; 12 $this->registered_email = $registered_email; 13 } 14}

リスナ

PHP

1class ChangeEmailListener 2{ 3 /** 4 *  一部省略 5 */ 6 public function handle(ChangeEmailEvent $event) 7 { 8 //新メールアドレスにメール確認(ここが問題) 9 if ($event->user instanceof MustVerifyEmail && ! $event->user->hasVerifiedEmail()) { 10 $event->user->sendEmailVerificationNotification(); 11 } 12 //旧メールアドレスに変更を通知 13 \Mail::to($event->registered_email)->send(new ChangeMail($event->user)); 14 } 15}

旧メールアドレスへの送信は成功しているので、イベントリスナは正常に動作しているはずです。

確認メールの生成送信に、登録時と同じロジックは使えないのでしょうか。

解決策を教えていただけますでしょうか。またその他問題点があればご指摘ください。

以上です。ご回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題なさそうなので実際に動かしてみないと分からないやつ…。
Userにimplements MustVerifyEmailは指定してるんですよね…。

ChangeEmailListenerまで来てる時点でemail_verified_atはnullなので
if省略してsendEmailVerificationNotification。
もしくはそれも省略してnotify

use Illuminate\Auth\Notifications\VerifyEmail; $event->user->notify(new VerifyEmail);

自分のやり方。
メール変更時はemail_verified_atをnullにするだけ。
メールを送るルートに入った時に確認画面(verify.blade.php)を出す。
ユーザーの操作でメールを送る場合の話。

投稿2019/03/01 17:37

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kriht

2019/03/02 16:18

if文省略で成功しました。送信されない原因も判明しました。 リスナクラスに use Illuminate\Contracts\Auth\MustVerifyEmail; を記述し忘れていたため、if($event->user instanceof MustVerifyEmail) が false になったことが原因でした。 メールアドレス変更時の認証メールの生成は、新規登録用の仕組みをそのまま使って問題なさそうですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問