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

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

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

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

Не могли бы вы поделиться с нами своим кодом? Было бы очень полезно.

Eliya Cohen 29.09.2018 16:53

Я использую код по умолчанию после настройки laravel и реализованных элементов аутентификации / проверки.

Markus 29.09.2018 17:17

вы выполнили все шаги по настройке проверки электронной почты?

Yves Kipondo 29.09.2018 19:48

вы получаете электронную почту в папке со спамом или во входящих?

Vipertecpro 29.09.2018 20:12

Нет. Когда я повторно отправляю письмо, все работает нормально.

Markus 29.09.2018 20:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
6
5
12 716
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

У меня была такая же проблема. Это код по умолчанию из 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;
    }

Я сделал, как показано выше, но я все еще не могу получить электронное письмо в своем почтовом ящике. Я проверил почтовую ловушку, и он показывает, что письмо было отправлено !!

Youssef Boudaya 13.02.2019 17:03

Если вы используете почтовую ловушку, вы никогда не получите письмо на свой почтовый ящик. Все данные будут в почтовом ящике. Это инструмент для развития.

JMoura 14.02.2019 20:08

что мне использовать, чтобы получать электронную почту в свой почтовый ящик?

Youssef Boudaya 18.02.2019 09:22

@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

JMoura 20.02.2019 20:58

Я обнаружил, что «правильный (по умолчанию 5.7) способ» - перейти к классу App\Providers\EventServiceProvider и добавить слушателя для SendEmailVerificationNotification. Добавьте это так: protected $listen = [ Illuminate\Auth\Events\Registered::class => [ Illuminate\Auth\Listeners\SendEmailVerificationNotification:‌​:class, ], ]; * Вы можете использовать / импортировать классы, чтобы сделать вещи красивыми.

abmblob 23.06.2019 19:25

Уже есть событие для Registered и слушателя SendEmailVerificationNotification. Не понимаю, почему это принятый ответ. Нет лучшего способа? У меня такая проблема.

good_afternoon 04.03.2020 01:22

У меня тоже была такая же проблема. Поскольку я проверил исходный код, нет необходимости реализовывать вызов метода 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, это должен быть правильный ответ, большое спасибо.

Oscar Muñoz 29.10.2018 21:14
Ответ принят как подходящий

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

event(new Registered($user));

это единственный ответ, который сработал для меня. На случай, если кто-то столкнется с этим в будущем, вы должны включить это в верхнюю часть вашего контроллера use Illuminate\Auth\Events\Registered.

maximus1127 02.09.2019 01:05

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

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

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

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

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

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

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

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

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

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

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

[email protected]
MAIL_FROM_NAME=Something

Я знаю, что этот пост немного устаревший, но у меня была аналогичная проблема с Laravel 7. Я думаю, что приведенный выше ответ Зейна должен быть принятым ответом. Чтобы уточнить это, используйте следующие шаги. Это нужно сделать после установки скаффолдинга auth с помощью composer и php artisan. Примечание: я ни в коем случае не профессионал в области 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']);
            }
        }
    }
}

Да, кажется, правильно. Для меня отправка нового события регистрации кажется лучше, чем отправка письма с подтверждением, как в текущем принятом ответе. Думаю, я приму ответ Зейна. Но все равно спасибо за это приятное разъяснение :)

Markus 15.07.2021 13:45

Другие вопросы по теме