Как настроить электронную почту для проверки электронной почты от Laravel 5.7?

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

Ответ 1

Если вы хотите добавить проверку электронной почты в Laravel 5.7, рекомендуется использовать Illuminate\Contracts\Auth\MustVerifyEmail и использовать черту Illuminate\Auth\MustVerifyEmail в App\User Model.

Чтобы настроить пользовательское поведение, вы можете переопределить метод sendEmailVerificationNotification который является методом, который уведомляет созданного пользователя, вызывая метод notify, и передает в качестве параметра новый экземпляр класса Notifications\MustVerifyEmail.

Вы можете создать пользовательское Уведомление, которое будет передаваться в качестве параметра в $this->notify() в методе sendEmailVerificationNotification вашей пользовательской модели:

public function sendEmailVerificationNotification()
{
    $this->notify(new App\Notifications\CustomVerifyEmail);
}

... затем в своем уведомлении CustomVerifyEmail вы можете определить способ обработки проверки. Вы можете оповестить созданного пользователя, отправив электронное письмо с пользовательским validation.route, который будет принимать любые параметры, которые вы хотите.

Процесс уведомления по электронной почте

Когда новый пользователь Illuminate\Auth\Events\Registered событие Illuminate\Auth\Events\Registered отправляется в App\Http\Controllers\Auth\RegisterController и это Registered событие имеет прослушиватель с именем Illuminate\Auth\Listeners\SendEmailVerificationNotification который зарегистрирован в App\Providers\EventServiceProvider:

protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ]
];

SendEmailVerificationNotification проверяет, SendEmailVerificationNotification ли $ user - который передается в качестве параметра new Registered($user = $this->create($request->all())) в App\Http\Controllers\Auth\RegisterController аутентификации Laravel по умолчанию App\Http\Controllers\Auth\RegisterController - это экземпляр Illuminate\Contracts\Auth\MustVerifyEmail который является именем признака, который, как предлагает Laravel, используется в App\User Model, когда вы хотите предоставить проверку электронной почты по умолчанию, а также проверить, что $user еще не проверен. Если все это проходит, метод sendEmailVerificationNotification вызывается для этого пользователя:

if ($event->user instanceof MustVerifyEmail && !$event->user->hasVerifiedEmail())   {
    $event->user->sendEmailVerificationNotification();
}

Ответ 2

Я думаю, что простой способ сделать это состоит в том, чтобы сделать новое уведомление, используя документы здесь: https://laravel.com/docs/5.7/notifications#creating-notifications

Затем переопределите функцию:

public function sendEmailVerificationNotification()
{
    $this->notify(new App\Notifications\CustomEmailNotification);
}

В модели пользователей.

Или вы можете

php artisan vendor:publish --tag=laravel-notifications

Это скопирует шаблоны в каталог resources/views/vendor/notifications, и вы можете изменить их там

Ответ 3

Для быстрого и простого способа:

php artisan vendor:publish --tag=laravel-notifications

Это создает новый файл в:

\resources\views\vendor\notifications

Это электронная почта Laravel. Вы можете изменить и настроить его.

Ответ 4

К сожалению, это письмо отправлено не из "представления", а Notification, которое встроено в строку. Здесь он Illuminate\Auth\Notifications\[email protected] при необходимости отправки: Illuminate\Auth\Notifications\[email protected]. Этот конкретный класс имеет статический обратный вызов, который можно настроить для создания этого письма вместо того, чтобы позволить ему это сделать.

В Провайдере в методе boot вам необходимо назначить обратный вызов для этого класса:

Что-то вроде этого может работать:

public function boot()
{
    \Illuminate\Auth\Notifications\VerifyEmail::toMailUsing(function ($notifiable) {

        // this is what is currently being done
        // adjust for your needs

        return (new \Illuminate\Notifications\Messages\MailMessage)
            ->subject(\Lang::getFromJson('Verify Email Address'))
            ->line(\Lang::getFromJson('Please click the button below to verify your email address.'))
            ->action(
                \Lang::getFromJson('Verify Email Address'),
                $this->verificationUrl($notifiable)
            )
            ->line(\Lang::getFromJson('If you did not create an account, no further action is required.'));

    });
}

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

Если вы хотите использовать свой собственный класс Notification вы можете переопределить метод sendEmailVerificationNotification на модели User (Authenticatable) (это из MustVerifyEmail).

Второй вопрос:

У VerificationController (App\Http\Controllers\Auth\VerificationController), который у вас должен быть, есть метод с именем resend (из свойства VerifiesEmails), который выглядит как хороший кандидат для этой цели.

Вам необходимо настроить маршруты для этих маршрутов проверки через Auth::routes(['verify' => true]);

Замечания:

Система проверки использует поле на users таблицы email_verified_at в 5.7, чтобы отметить это. Вы бы хотели убедиться, что у вас есть это поле. Когда пользователь меняет адрес электронной почты, я предполагаю, что вы могли бы сделать этот null затем перенаправить их на маршрут resend отправки, чтобы отправить новую проверку. Это приведет их в "непроверенное" состояние, хотя до тех пор, пока они не почитают, если это то, что вы намереваетесь совершить.

Обновить:

Кажется, мы шли по правильному пути. Я нашел этот ответ SO, который затрагивает похожие вещи:

Изменение поля "subject" по умолчанию для электронного письма проверки в laravel 5.7

Ответ 5

Немного опираясь на ответ Эндрю Эрлса, вы также можете опубликовать все компоненты почтовой рассылки, используемые приложением, с помощью этой команды:

php artisan vendor:publish --tag=laravel-mail

Как только это будет сделано, у вас будет ряд html файлов и файлов разметки для изменения в resources/views/vendor/mail. Это позволит вам изменить общий макет электронной почты, а также "тему" CSS. Я очень рекомендую внимательно прочитать Документы по почте - Настройка компонентов.

CSS тематика

В качестве общего краткого руководства по электронной почте (Laravel 5.7) вы можете:

  1. Опубликуйте тему с помощью php artisan vendor:publish --tag=laravel-mail.
  2. Скопируйте resources/views/vendor/mail/html/themes/default.css в свой собственный файл. например resources/views/vendor/mail/html/themes/wayne.css
  3. Отредактируйте config/mail.php и там, где вы видите 'theme' => 'default' измените его на 'theme' => 'wayne'
  4. Отредактируйте wayne.css чтобы изменить ваши электронные письма.

Надеюсь, что это помогает кому-то.

Ответ 6

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

 // send new verification email to user
 $user->sendEmailVerificationNotification();

Ответ 7

Перейдите к этим файлам

  • vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php

  • vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php

а затем настроить его. Вы даже можете ввести конструктор в продавец/Laravel/рамки /SRC/Осветите /Auth/Уведомления /VerifyEmail.php и передать значение через vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php

например: Created my own constructor Utilized the user array values passed to the constructor Passing the constructor value from the