【问题标题】:Laravel 5.7 - Verification email is not sentLaravel 5.7 - 未发送验证电子邮件
【发布时间】:2019-03-05 06:49:22
【问题描述】:

我已将我的 laravel 实例从 5.6 版升级到 5.7 版。现在我尝试使用built-in email verification from laravel

我的问题是注册成功后使用“重新发送”功能邮件到达时收不到邮件。

有什么问题?

【问题讨论】:

  • 您介意与我们分享您的代码吗?这将非常有帮助。
  • 我是设置 laravel 和实现的认证/验证东西后的默认代码。
  • 您是否按照所有步骤配置电子邮件验证?
  • 您是否在垃圾邮件文件夹或收件箱中收到电子邮件?
  • 没有。当我重新发送邮件时,一切正常。

标签: laravel email laravel-5 email-validation laravel-5.7


【解决方案1】:

我遇到了同样的问题。这是 Laravel 的默认代码。

为了在成功注册后发送电子邮件,您可以执行以下解决方法:

App\Http\Controllers\Auth\RegisterController

改变这个:

protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);
    }

对此:

protected function create(array $data)
    {
        $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
        ]);

        $user->sendEmailVerificationNotification();

        return $user;
    }

【讨论】:

  • 我做了如上所示,但我仍然无法在我的收件箱中收到电子邮件我检查了mailtrap,它显示邮件已发送!
  • 如果您使用 mailtrap,您将永远不会在自己的收件箱中收到电子邮件。所有数据都将在 mailtrap 中。那是一种开发工具。
  • 我应该使用什么来在自己的收件箱中接收电子邮件?
  • @YoussefBoudaya Laravel 在流行的 SwiftMailer 库上提供了一个干净、简单的 API,其中包含 SMTP、Mailgun、SparkPost、Amazon SES 和 sendmail 的驱动程序。我建议您通过仅在 .env 文件中定义凭据来开始使用 SMTP。这里是一个例子: MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=465 MAIL_USERNAME=example@gmail.com MAIL_PASSWORD=123456 MAIL_ENCRYPTION=ssl
  • 我发现“正确的(5.7默认)方式”是去App\Providers\EventServiceProvider类并为SendEmailVerificationNotification添加监听器。像这样添加它:protected $listen = [ Illuminate\Auth\Events\Registered::class => [ Illuminate\Auth\Listeners\SendEmailVerificationNotification::class, ], ]; *您可以使用/导入类来使事情变得漂亮。
【解决方案2】:

我也遇到了同样的问题。当我检查源代码时,不需要实现调用sendEmailVerificationNotfication()方法,你只需将事件处理程序添加到你的EventServiceProvider.php,因为你的事件处理程序是之前创建的,所以Larael不能更新那个。它应该是这样的:

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
    ];

【讨论】:

  • 按照Laravel的结构,这应该是正确的答案,非常感谢。
【解决方案3】:

如果您有自定义注册页面,您可以在创建用户后触发事件,如下所示:

event(new Registered($user));

【讨论】:

  • 这是唯一对我有用的答案。如果将来有人遇到此问题,您必须将其包含在控制器顶部 use Illuminate\Auth\Events\Registered
【解决方案4】:

以防其他人正在寻找相同问题的解决方案。

请阅读文档,它准确地解释了解决这个问题需要做什么

https://laravel.com/docs/5.7/verification

简而言之,如果您已经在使用 5.7(即您的 users 表中有必要的字段),您需要做的就是:

  • 让您的User 模型实现MustVerifyEmail 接口。
  • ['verify' => true] 添加到Auth::routes 方法Auth::routes(['verify' => true]);

您可以在上面的链接中找到有关电子邮件验证的所有信息。

【讨论】:

    【解决方案5】:

    除了djug的回复,如果你从5.6版本升级后遇到同样的问题,和我一样,你会在这里找到一步一步的指导来实现:

    https://laravel.com/docs/5.7/upgrade

    电子邮件验证部分下

    希望这可以帮助某人,因为我已经为此苦苦挣扎了一段时间。

    【讨论】:

      【解决方案6】:

      确保您已设置“发件人电子邮件”,因为大多数 SMTP 服务器不允许从任何地址发送。这些环境配置是:

      MAIL_FROM_ADDRESS=from@domain.com
      MAIL_FROM_NAME=Something
      

      【讨论】:

        【解决方案7】:

        我知道这篇文章有点老,但我在 Laravel 7 上遇到了类似的问题。我认为 Zane 的上述答案应该是公认的答案。只是为了详细说明,请使用以下步骤。这应该在使用 composer 和 php artisan 安装 auth 脚手架之后完成。注意:我绝不是 Laravel 专业人士。如果我的代码有任何问题,请告诉我。我学得越多越好。

        准备用户模型


        确保您的 App\User 模型实现 Illuminate\Contracts\Auth\MustVerifyEmail:

        <?php
        
        namespace App;
        
        use Illuminate\Contracts\Auth\MustVerifyEmail;
        use Illuminate\Foundation\Auth\User as Authenticatable;
        use Illuminate\Notifications\Notifiable;
        
        class User extends Authenticatable implements MustVerifyEmail
        {
            use Notifiable;
        
            // ...
        }
        

        设置路由


        在 routes\web.php 中更改:

        Auth::routes();
        

        到这里:

        Auth::routes(['verify'=>true]);
        

        之后,您可以通过在这样的路由上直接使用中间件来指定哪些路由需要经过验证的电子邮件地址:

        Route::get('/profile','ProfileController@index')->middleware('verified');
        

        或者你可以在控制器的构造函数中这样做:

        public function __construct()
        {
            $this->middleware(['auth','verified']);
        }
        

        修改后的寄存器控制器


        我正在使用以下寄存器控制器代码。请注意,注册函数包含对以下内容的调用:

        event(new Registered($user));
        

        这是发送初始注册电子邮件的关键。

        注册控制器

        请记住,此控制器设计用于主要用于 ajax 站点,因此 register 函数返回 json 响应。

        <?php
        
        namespace App\Http\Controllers\Auth;
        
        use App\Http\Controllers\Controller;
        use App\Providers\RouteServiceProvider;
        use App\User;
        use Illuminate\Foundation\Auth\RegistersUsers;
        use Illuminate\Support\Facades\Hash;
        use Illuminate\Support\Facades\Validator;
        use Illuminate\Http\Request;
        use Illuminate\Auth\Events\Registered;
        use Auth;
        
        class RegisterController extends Controller
        {
            /*
            |--------------------------------------------------------------------------
            | Register Controller
            |--------------------------------------------------------------------------
            |
            | This controller handles the registration of new users as well as their
            | validation and creation. By default this controller uses a trait to
            | provide this functionality without requiring any additional code.
            |
            */
        
            use RegistersUsers;
        
            /**
             * Where to redirect users after registration.
             *
             * @var string
             */
            protected $redirectTo = RouteServiceProvider::HOME;
        
            /**
             * Create a new controller instance.
             *
             * @return void
             */
            public function __construct()
            {
                $this->middleware('guest');
            }
        
            /**
             * Get a validator for an incoming registration request.
             *
             * @param  array  $data
             * @return \Illuminate\Contracts\Validation\Validator
             */
            protected function validator(array $data)
            {
                return Validator::make($data, [
                    'first_name' => ['required', 'string', 'max:255'],
                    'last_name' => ['required', 'string', 'max:255'],
                    'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                    'phone_number' => ['required', 'numeric', 'min:10'],
                    'password' => ['required', 'string', 'min:8', 'confirmed'],
                    'password_confirmation'=> ['required', 'string'],
                ]);
            }
        
            /**
             * Create a new user instance after a valid registration.
             *
             * @param  array  $data
             * @return \App\User
             */
            protected function create(array $data)
            {
                $user=User::create([
                    'first_name' => $data['first_name'],
                    'last_name' => $data['last_name'],
                    'email' => $data['email'],
                    'phone_number' => $data['phone_number'],
                    'password' => Hash::make($data['password']),
                ]);
                return $user;
            }
        
             /**
             * Execute registration and login the user
             *
             * @param  array  $request
             * @return response
             */
            public function register(Request $request)  {
                $validation = $this->validator($request->all());
                if ($validation->fails())  {
                    return response()->json($validation->errors(),422);
                }
                else{
                    $user = $this->create($request->all());
                    event(new Registered($user));
                    Auth::login($user);
                    if (Auth::user()){
                        return response()->json(['success'=>'Registration Successful']);
                    }
                }
            }
        }
        

        【讨论】:

        • 是的,这似乎是正确的。对我来说,发送一个新的注册事件似乎比发送当前接受的答案中的验证电子邮件更好。我想我会接受赞恩的回答。但无论如何感谢这个很好的澄清:)
        猜你喜欢
        • 2023-03-28
        • 1970-01-01
        • 2019-10-18
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 2019-06-04
        • 2019-05-11
        相关资源
        最近更新 更多