7

我已将我的 laravel 实例从 5.6 版升级到 5.7 版。现在我尝试使用laravel 的内置电子邮件验证

我的问题是,当我使用“重新发送”功能时,我注册成功后没有收到电子邮件,电子邮件到达。

问题是什么?

4

7 回答 7

28

我有这个完全相同的问题。这是 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;
    }
于 2018-10-20T15:51:18.997 回答
14

我也有同样的问题。当我检查源代码时,不需要实现调用该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,
        ],
    ];
于 2018-10-24T08:13:18.893 回答
6

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

event(new Registered($user));

于 2018-11-25T20:59:20.557 回答
4

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

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

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

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

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

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

于 2019-02-07T10:04:18.980 回答
2

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

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

电子邮件验证部分下

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

于 2019-03-14T19:29:55.897 回答
1

我知道这篇文章有点老,但我对 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']);
            }
        }
    }
}
于 2021-07-15T02:01:44.697 回答
-1

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

MAIL_FROM_ADDRESS=from@domain.com
MAIL_FROM_NAME=Something
于 2020-04-25T17:01:54.170 回答