Laravel 5.7 - письмо с подтверждением не отправляется

Я обновил свой экземпляр laravel с версии 5.6 до версии 5.7. Теперь я пытаюсь использовать встроенную проверку электронной почты от laravel.

Моя проблема в том, что я не получаю электронное письмо после успешной регистрации, когда я использую функцию «повторной отправки», когда приходит электронное письмо.

В чем проблема?


person Markus    schedule 29.09.2018    source источник
comment
Не могли бы вы поделиться с нами своим кодом? Было бы очень полезно.   -  person Eliya Cohen    schedule 29.09.2018
comment
Я использую код по умолчанию после настройки laravel и реализованных элементов аутентификации / проверки.   -  person Markus    schedule 29.09.2018
comment
вы выполнили все шаги по настройке проверки электронной почты?   -  person Yves Kipondo    schedule 29.09.2018
comment
вы получаете электронную почту в папке со спамом или во входящих?   -  person Vipertecpro    schedule 29.09.2018
comment
Нет. Когда я отправляю письмо еще раз, все работает нормально.   -  person Markus    schedule 29.09.2018


Ответы (7)


Если у вас есть настраиваемая страница регистрации, вы можете просто запустить событие после создания пользователя следующим образом:

event(new Registered($user));

person Zane    schedule 25.11.2018
comment
это единственный ответ, который у меня сработал. Если кто-то столкнется с этим в будущем, вы должны включить это в верхнюю часть вашего контроллера use Illuminate\Auth\Events\Registered - person maximus1127; 02.09.2019

У меня была такая же проблема. Это код по умолчанию из Laravel.

Чтобы отправить электронное письмо после успешной регистрации, вы можете сделать следующее:

at 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;
    }
person JMoura    schedule 20.10.2018
comment
Я сделал, как показано выше, но я все еще не могу получить электронное письмо в своем почтовом ящике. Я проверил почтовую ловушку, и она показывает, что письмо было отправлено !! - person Youssef Boudaya; 13.02.2019
comment
Если вы используете mailtrap, вы никогда не получите письмо на свой почтовый ящик. Все данные будут в почтовом ящике. Это инструмент для развития. - person JMoura; 14.02.2019
comment
что я должен использовать, чтобы получать электронную почту в моем собственном почтовом ящике? - person Youssef Boudaya; 18.02.2019
comment
@YoussefBoudaya Laravel предоставляет чистый и простой API поверх популярной библиотеки SwiftMailer с драйверами для SMTP, Mailgun, SparkPost, Amazon SES и sendmail. Я рекомендую вам начать использовать SMTP, указав только учетные данные в вашем файле .env. Вот пример: MAIL_DRIVER = smtp MAIL_HOST = smtp.gmail.com MAIL_PORT = 465 [email protected] MAIL_PASSWORD = 123456 MAIL_ENCRYPTION = ssl - person JMoura; 20.02.2019
comment
Я обнаружил, что правильный (по умолчанию 5.7) способ - перейти к классу App\Providers\EventServiceProvider и добавить слушателя для SendEmailVerificationNotification. Добавьте это так: protected $listen = [ Illuminate\Auth\Events\Registered::class => [ Illuminate\Auth\Listeners\SendEmailVerificationNotification::class, ], ]; * Вы можете использовать / импортировать классы, чтобы сделать вещи красивыми. - person abmblob; 23.06.2019
comment
Уже есть событие для Registered и слушателя SendEmailVerificationNotification. Не понимаю, почему это принятый ответ. Нет лучшего способа? У меня такая проблема. - person good_afternoon; 04.03.2020

У меня тоже была такая же проблема. Поскольку я проверил исходный код, нет необходимости реализовывать вызов метода sendEmailVerificationNotfication(), вам просто нужно добавить обработчик событий в свой EventServiceProvider.php, поскольку ваш обработчик событий был создан ранее, поэтому Лараэль не может его обновить. Должно получиться так:

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,
        ],
    ];
person laze    schedule 24.10.2018
comment
Следуя структуре Laravel, это должен быть правильный ответ, большое спасибо. - person Oscar Muñoz; 29.10.2018

на случай, если кто-то другой ищет решение той же проблемы.

пожалуйста, прочтите документацию, она точно объясняет, что нужно сделать, чтобы решить эту проблему.

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

в двух словах, и если вы уже используете 5.7 (т.е. у вас есть необходимые поля в вашей users таблице), все, что вам нужно сделать, это следующее:

  • пусть ваша User модель реализует MustVerifyEmail интерфейс.
  • добавить ['verify' => true] к Auth::routes методу Auth::routes(['verify' => true]);

вы можете найти все, что вам нужно о подтверждении электронной почты, по ссылке выше.

person djug    schedule 07.02.2019

В дополнение к ответу djug, если вы столкнетесь с той же проблемой после обновления с версии 5.6, как и я, вы найдете здесь пошаговое руководство по реализации:

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

в разделе Подтверждение электронной почты

Надеюсь, это поможет кому-то, поскольку я довольно долго боролся с этим.

person Adam Brzeziński    schedule 14.03.2019

Я знаю, что этот пост немного устаревший, но у меня была аналогичная проблема с Laravel 7. Я думаю, что приведенный выше ответ Зейна должен быть принятым ответом. Чтобы уточнить это, используйте следующие шаги. Это нужно сделать после установки скаффолдинга auth с помощью composer и php artisan. Примечание: я ни в коем случае не являюсь профессионалом Laravel. Если есть какие-либо проблемы с моим кодом, ПОЖАЛУЙСТА, дайте мне знать. Чем больше я узнаю, тем лучше буду.

Prepare the User Model


Убедитесь, что ваша модель 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;

    // ...
}

Setup Routes


В routes \ web.php измените это:

Auth::routes();

К этому:

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

После этого вы можете указать, для каких маршрутов требуется подтвержденный адрес электронной почты, либо используя промежуточное ПО непосредственно на маршруте, подобном этому:

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

или вы можете сделать это в функции конструктора контроллера следующим образом:

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

Modified Register Controller


Я использую следующий код контроллера регистра. Обратите внимание, что функция регистрации содержит вызов следующего:

event(new Registered($user));

Это был ключ к отправке письма с первоначальной регистрацией.

Register Controller

Имейте в виду, что этот контроллер был разработан для работы в основном с сайтом 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']);
            }
        }
    }
}
person Shadow6290    schedule 15.07.2021
comment
Да, кажется, правильно. Для меня отправка нового события регистрации кажется лучше, чем отправка письма с подтверждением, как в текущем принятом ответе. Думаю, я приму ответ Зейна. Но все равно спасибо за это приятное разъяснение :) - person Markus; 15.07.2021

Убедитесь, что у вас есть настройка «От электронной почты», так как большинство SMTP-серверов не разрешают отправку с любого адреса. Конфигурация env для них:

[email protected]
MAIL_FROM_NAME=Something
person phoenix    schedule 25.04.2020