Laravel 5 重置密码通知不会发送

Posted

技术标签:

【中文标题】Laravel 5 重置密码通知不会发送【英文标题】:Laravel 5 Reset password notification won't send 【发布时间】:2017-08-02 23:45:55 【问题描述】:

我正在尝试在我的应用程序中实现默认重置密码通知,但是当我尝试重置密码时,什么也没有发生,它只会说“我们已通过电子邮件发送您的密码重置链接!”但是当我尝试检查我的邮箱时,我的应用程序没有发送任何电子邮件。

我对我的应用程序进行了所有必要的配置: 电子邮件驱动程序, 数据库设置

但是我确实更改了 Laravel 的某些部分: 用户模型, 用户表迁移

我确实更改了表格列。

id、姓名、US_EMAIL、密码、remember_token、created_at、updated_at、 EMP_POSITION, FACTORY, CONTACT, SIGNATURE, ONLINE, DATE_ONLINE, ADMIN, 锁定

我在重置密码表上什么也没做,所有字段在默认的 laravel 迁移中都是完整的。

当我尝试调试我的应用程序时,似乎当我尝试重置密码时,应用程序可以成功地将数据保存到“password_resets”表中,但我仍然无法收到电子邮件重置通知。

我也确实看过这个特征,我尝试“转储并死去”以查看单击“发送密码重置链接”后进程的去向,似乎应用程序仍然可以继续这个特征,因为它仍然显示“dd”消息。

    <?php

namespace Illuminate\Auth\Passwords;

use Illuminate\Auth\Notifications\ResetPassword as ResetPasswordNotification;

trait CanResetPassword

    /**
     * Get the e-mail address where password reset links are sent.
     *
     * @return string
     */
    public function getEmailForPasswordReset()
    
        return $this->EMAIL;
    

    /**
     * Send the password reset notification.
     *
     * @param  string  $token
     * @return void
     */
    public function sendPasswordResetNotification($token)
    
        dd('Test SendPasswordNotification');
        $this->notify(new ResetPasswordNotification($token));
    

我也确实看过这个,但是当我尝试“转储并死”到“toMail”功能时,它没有继续。我在想也许应用程序不会发送电子邮件,因为它无法继续上课,我只是在猜测,但我希望有人可以帮助我。

    <?php

namespace Illuminate\Auth\Notifications;

use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class ResetPassword extends Notification

    /**
     * The password reset token.
     *
     * @var string
     */
    public $token;

    /**
     * Create a notification instance.
     *
     * @param  string  $token
     * @return void
     */
    public function __construct($token)
    
        $this->token = $token;
    

    /**
     * Get the notification's channels.
     *
     * @param  mixed  $notifiable
     * @return array|string
     */
    public function via($notifiable)
    
        return ['mail'];
    

    /**
     * Build the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    
      dd('Test ToMail');
        return (new MailMessage)
            ->line('You are receiving this email because we received a password reset request for your account.')
            ->action('Reset Password', route('password.reset', $this->token))
            ->line('If you did not request a password reset, no further action is required.');
    

更新:我可以使用我的 .env 电子邮件设置发送电子邮件,我认为 应用程序可以对我使用的电子邮件服务器进行身份验证。唯一的 问题是我无法收到密码重置的电子邮件通知,并且在我点击“发送密码重置链接”后它也没有显示任何错误。

【问题讨论】:

呃,尝试发送非重置密码邮件,只是普通的通用邮件,看看会发生什么。 嗨,我收到了,看来我可以收到不可重置的电子邮件,我唯一的问题是密码重置,因为我真的无法接收,它不会显示任何错误。 【参考方案1】:

我终于找到问题所在了。

当我将用户表中的电子邮件列更改为“US_EMAIL”时,Illuminate\Notifications 特征中有一个函数可以检索电子邮件列。

Illuminate\Notifications

  public function routeNotificationFor($driver)



    if (method_exists($this, $method = 'routeNotificationFor'.Str::studly($driver))) 
        return $this->$method();
    


    switch ($driver) 
        case 'database':
            return $this->notifications();
        case 'mail':
            return $this->email;
        case 'nexmo':
            return $this->phone_number;
    

解决办法:

on the "routeNotificationFor" function i changed this line "return $this->email;"

到:

到“返回这个->US_EMAIL;”

【讨论】:

一只该死的母狗的儿子......你在编程上赢了,先生。【参考方案2】:

在我看来,您应该检查您的 config/mail.php 和 .env 以验证您的电子邮件设置。我最初的猜测是您将其设置为“mail”或“sendmail”,并且没有安装在您的机器或服务器上。

也许可以使用外部电子邮件服务(mailgun、sparkpost 等)创建一个免费帐户并将其设置为排除这种情况?


编辑:再次阅读后,我认为您的问题是:

public function getEmailForPasswordReset() return $this->EMAIL;

根据您问题的顶部,您数据库中的“电子邮件”字段实际上是“US_EMAIL”。

public function getEmailForPasswordReset() return $this->US_EMAIL;

【讨论】:

我认为我的电子邮件设置很好,因为我可以发送非重置邮件【参考方案3】:

有 3 件事需要检查

第一:.env文件

MAIL_DRIVER=smtp 
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=email@email.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls

这是用于生产和gmail 消息

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=usernamefrommailtrap
MAIL_PASSWORD=somepasswordfrommailtrap
MAIL_ENCRYPTION=null

这是用于测试和mailtrap 消息

二:config/mail.php

确保使用正确的数据正确设置您的配置文件。或者确保它从.env 文件中调用正确的信息

第三:刷新

编辑.env 文件后不要忘记停止php artisan serve 并再次运行它。 编辑config/mail.php文件后不要忘记运行php artisan config:cache删除保存的缓存并创建一个新的

【讨论】:

我试图浏览这个类 Illuminate\Auth\Notifications\ResetPassword 并检查我是否可以通过。 __construct、via 和 toMail 有 3 个函数,我尝试在前 2 个函数上转储并死掉,这是成功的,它可以通过,但在最后一个函数上,我放了转储并死掉它无法通过跨度> 哦。您使用的是哪个邮件系统? gmail还是mailtrap? 我使用 gmail,我也注意到当我改回用户模型中的默认“email”列名时,因为我将其重命名为“user_email”,这是成功的,我可以收到密码重置电子邮件.【参考方案4】:

请检查您的.env 文件并查找MAIL_DRIVER。 在电子邮件测试器中创建一个虚拟电子邮件,例如Mailtrap.io

使用Mailtrap.io:

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=usernamefrommailtrap
MAIL_PASSWORD=somepasswordfrommailtrap
MAIL_ENCRYPTION=null

现在测试它,如果您收到电子邮件,请在 Mailtrap 中检查您的虚拟电子邮件。

【讨论】:

我可以使用我的电子邮件设置发送电子邮件,我认为 .env 电子邮件设置没有问题。真不知道哪里出了问题。

以上是关于Laravel 5 重置密码通知不会发送的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.4 密码重置问题——发送邮件

无法在 laravel 5.3 中发送密码重置链接?

如何在 Laravel 5.2 中手动发送密码重置请求?

如何使用 laravel 5 中的队列通过电子邮件发送密码重置链接

如何在 Laravel 5 中更改默认重置密码链接

Laravel 5 邮箱重置密码