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

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

ただいまの
回答率

90.04%

laravel パスワードリセットが動かない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,182

mizutama72

score 29

laravel初心者です。
パスワードリセットが動かず悩んでおります。

route.phpには、

Route::get('/password/email', 'Auth\PasswordController@getEmail');
Route::post('/password/email', 'Auth\PasswordController@postEmail');

Route::get('/password/reset/{token}', 'Auth\PasswordController@getReset');
Route::post('/password/reset', 'Auth\PasswordController@postReset');


と設定しました。

viewは、
views/auth/password.blade.php
views/auth/reset.blade.php
views/emails/password.blade.php
を用意しました。

ですが、emailを入力して送信ボタンをクリックすると、画面が真っ白になります。

過去の投稿を参考にして、
vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.phpの
デバッグをしてみたら、以下の$responseの値がnullでした。
$request->only('email')の値は正しく取得できています。

あとは、どの部分をチェックしたらいいのか、教えてください。
宜しくお願いします。

$response = Password::sendResetLink($request->only('email'), function (Message $message) {
            $message->subject($this->getEmailSubject());
        });

メールは送信されていません。
エラーログは、htdocs/システム名/storage/logs/laravel.log には、エラーらしきログは出ません。(送信時間にログファイルが更新されません。) 
その他、見るべきところはありますでしょうか? 
ちなみに

$mailer->send( 
'user.email.confirm', 
['user' => $user, 'token' => $user->confirmation_token], function ($message) use ($user) { $message->to($user->email)->subject('仮登録のお知らせ'); } );

 
別の機能ですが、上記の場合のメールは送ることができるので、パスワードリセットに限っておかしいような形です。。

formのactionは、

<form class="form-auth" action="/password/email" method="POST">

envは、システム名などがあるので、全部は出せませんが、

APP_ENV=local
APP_DEBUG=true
APP_KEY=XXXXXXXXXXXXXXXXXXXXXXXX

DB_HOST=127.0.0.1
DB_DATABASE=DB名
DB_USERNAME=root
DB_PASSWORD=root

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

MAIL_DRIVER=smtp
MAIL_HOST=お名前サーバー
MAIL_PORT=587
MAIL_FROM_ADDRESS=システムのメールアドレス
MAIL_FROM_NAME=システムのユーザ名
MAIL_USERNAME=システムのメールアドレス
MAIL_PASSWORD=パスワード
MAIL_ENCRYPTION=tls

となっています。

以下を試しましたが、

# php artisan tinker
Psy Shell v0.4.4 (PHP 5.5.26 — cli) by Justin Hileman
>>> Mail::raw('Test Mail', function($message) { $message->to('xxxx@xxxx.jp')->subject('test'); });
=> 1


xxxx@xxxx.jp には正常にメールが届きます。

また、以前に別の担当者がマルチユーザ対応?ということで、

Route::post('/admin/password_reset',function(Request $request){
  Password::admin()->sendResetLink($request->only('email'), function (Message $message) {
      $message->subject("Password Reset Link");
  });
  //ログイン画面に戻る
  return \Redirect::to("/admin");
});


ということをやっていた経緯があります。現在はやっていません。

resetPasswordsに上記のようにやってみると、

$response = Password::user()->sendResetLink($request->only('email'), function (Message $message) {
            $message->subject($this->getEmailSubject());
        });
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'email' cannot be null

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'email' cannot be null (SQL: insert into `password_resets` (`email`, `token`, `type`, `created_at`) values (, 41ab894a204a827415dcd728ff1a41....

とemailが取れないというエラーになります。
ですが、上記のsendResetLinkの前に、var_dump($request->only('email'))を実行すると、メールアドレスは取得できます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • twin_bird

    2016/09/16 01:42

    エラーログが見れると良いのですが、メールはおそらく送信されていませんよね??

    キャンセル

  • mizutama72

    2016/09/16 08:47

    ご回答ありがとうございます!
    メールは送信されていません。
    エラーログは、htdocs/システム名/storage/logs/laravel.log には、エラーらしきログは出ません。(送信時間にログファイルが更新されません。)
    その他、見るべきところはありますでしょうか?

    ちなみに
    $mailer->send(
    'user.email.confirm',
    ['user' => $user, 'token' => $user->confirmation_token],
    function ($message) use ($user) {
    $message->to($user->email)->subject('仮登録のお知らせ');
    }
    );
    別の機能ですが、上記の場合のメールは送ることができるので、パスワードリセットに限っておかしいような形です。。

    キャンセル

回答 2

check解決した方法

+1

自己解決いたしました。
config/auth.phpにmulti-auth'の設定がされていて、複数ユーザが設定されていたのですが、他のユーザと同じようにmodelの設定をしたら、メールが飛ぶようになりました。
お騒がせいたしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Laravel APIで実装を調べてみました。
Interface
https://github.com/laravel/framework/blob/5.1/src/Illuminate/Contracts/Auth/PasswordBroker.php

sendResetLinkMail
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Foundation/Auth/ResetsPasswords.php

PasswordBroker
https://github.com/laravel/framework/blob/5.2/src/Illuminate/Auth/Passwords/PasswordBroker.php#L106

responseにnullが返ってくるのはメールがちゃんと送信されていないからのような気がします。
メールのテスト環境が何かわかりませんが、formのactionやらenvファイルやらメールを送信するための環境をチェックしてみては?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる