Как настроить письмо с подтверждением электронной почты из Laravel 5.7?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
25
0
40 705
9

Ответы 9

К сожалению, это электронное письмо, которое было отправлено, не из «представления», это Notification, который на самом деле встроен в строку. Вот где он в настоящее время создается, когда его нужно отправить: Illuminate\Auth\Notifications\VerifyEmail@toMail. Этот конкретный класс имеет статический обратный вызов, который можно настроить для создания этого электронного письма, вместо того, чтобы позволить ему это сделать.

В поставщике услуг в методе 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]);.

Примечание:

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

Обновлять:

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

Изменение поля «тема» по умолчанию для письма с подтверждением в laravel 5.7

Спасибо за вашу помощь. Ты определенно направил меня на верный путь. Я еще не реализовал вопрос / ответ 1, но для вопроса 2 очень просто просто вызвать метод в модели User. $ user-> sendEmailVerificationNotification (); Я работаю над вопросом 1 и опубликую результаты.

Wayne Fulcher 20.09.2018 13:34

Думаю, это лучший ответ, потому что вы указали мне более быстрое решение

realtebo 07.10.2019 15:01

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

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

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

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

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

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

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

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

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

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

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

В моем случае (настройка проверочного электронного письма по умолчанию для laravel 5.8) мне пришлось объединить этот ответ с ответом Mere Development и выполнить некоторые дополнительные работы, чтобы выполнить свою работу.

sajed zarrinpour 01.08.2019 17:15

Также взгляните на Illuminate\Auth\Notifications\VerifyEmail и сравните его с CustomEmailNotification. Также полезно увидеть laravel.com/docs/5.8/mail#customizing-the-components и laravel.com/docs/5.8/notifications. И последнее: я не знаю, почему у меня не работает CSS-тематика. Я просто скопировал все нужные мне стили прямо в файл vendor/mail/html/layout.blade.php.

sajed zarrinpour 01.08.2019 17:17

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

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

Как только это будет сделано, у вас будет ряд файлов html и markdown, которые нужно изменить в 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, чтобы изменить стиль своей электронной почты.

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

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

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

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

\resources\views\vendor\notifications

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

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

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

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

а затем настройте его. вы даже можете ввести конструктор в поставщик / laravel / framework / src / Illuminate / Auth / Notifications / VerifyEmail.php и передать значение через vendor / laravel / framework / src / Illuminate / Auth / MustVerifyEmail.php

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

Никогда не редактируйте файлы каталога поставщиков, самая большая ошибка в мире.

Marc 27.01.2020 09:53

Редактирование файлов внутри каталога vendor не является хорошей идеей, потому что файлы перезаписываются после обновления ваших зависимостей через composer update.

nwaweru 18.02.2020 12:45

Производитель изменится при обновлении с помощью композитора. Никогда не пытайтесь редактировать файлы поставщика.

sta 15.07.2020 17:27

Интерфейс interface MustVerifyEmail позволяет вам переопределить указанные здесь функции. Так что вам не нужно редактировать какие-либо файлы /vendor/. Вместо этого скопируйте любой метод, который вам нравится, из этого интерфейса в модель пользователя, а затем скопируйте файлы поставщиков, которые вам нужны, и вставьте их в эту функцию в модели пользователя ...

Pathros 28.03.2021 20:38

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

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

In Route File

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

In AppServiceProvider.php File

namespace App\Providers;
use App\Mail\EmailVerification;
use Illuminate\Support\ServiceProvider;
use View;
use URL;
use Carbon\Carbon;
use Config;
use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Override the email notification for verifying email
        VerifyEmail::toMailUsing(function ($notifiable){        
            $verifyUrl = URL::temporarySignedRoute('verification.verify',
            \Illuminate\Support\Carbon::now()->addMinutes(\Illuminate\Support\Facades 
            \Config::get('auth.verification.expire', 60)),
            [
                'id' => $notifiable->getKey(),
                'hash' => sha1($notifiable->getEmailForVerification()),
            ]
        );
        return new EmailVerification($verifyUrl, $notifiable);

        });

    }
}

Now Create EmailVerification With Markdown

php artisan make:mail EmailVerification --markdown=emails.verify-email

Отредактируйте EmailVerrification по своему усмотрению и файл лезвия.

class EmailVerification extends Mailable
{
    use Queueable, SerializesModels;
    public $verifyUrl;
    protected $user;
    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($url,$user)
    {
        $this->verifyUrl = $url;
        $this->user = $user;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        $address = '[email protected]';
        $name = 'Name';
        $subject = 'verify Email';
        return $this->to($this->user)->subject($subject)->from($address, $name)->
        markdown('emails.verify',['url' => $this->verifyUrl,'user' => $this->user]);
    }
}

in the blade file change the design as you want and use verifyUrl to display the verification link and $user to display user information

спасибо, удачного кодирования :)

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

Шаг 1

Создайте новое уведомление UserVerifyNotification class. Следует расширить VerifyEmail class из библиотеки Illuminate\Auth\Notifications\VerifyEmail;

Код:

    use Illuminate\Auth\Notifications\VerifyEmail;
    ...
    class UserVerifyNotification extends VerifyEmail implements ShouldQueue
    {
        use Queueable;
        public $user;            //you'll need this to address the user
    
        /**
         * Create a new notification instance.
         *
         * @return void
         */
        public function __construct($user='')
        {
            $this->user =  $user ?: Auth::user();         //if user is not supplied, get from session
        }
    
        /**
         * Get the notification's delivery channels.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function via($notifiable)
        {
            return ['mail'];
        }
    
        /**
         * Get the mail representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return \Illuminate\Notifications\Messages\MailMessage
         */
        public function toMail($notifiable)
        {
            $actionUrl  = $this->verificationUrl($notifiable);     //verificationUrl required for the verification link
            $actionText  = 'Click here to verify your email';
            return (new MailMessage)->subject('Verify your account')->view(
                'emails.user-verify',
                [
                    'user'=> $this->user,
                    'actionText' => $actionText,
                    'actionUrl' => $actionUrl,
                ]);
        }
    
        /**
         * Get the array representation of the notification.
         *
         * @param  mixed  $notifiable
         * @return array
         */
        public function toArray($notifiable)
        {
            return [
                //
            ];
        }
        
    }
    

    

Шаг 2

Создайте вид лезвия для электронной почты (пользователь-verify.blade.php) внутри resources\views\emails

    <DOCTYPE html>
    <html lang = "en-US">
         
        <head>
            <meta charset = "utf-8">
        </head>
    
        <body>
            <p>Dear {{$user->name}},</p>
            <p>
                Please click the button below to verify your email address.
            </p>
    
            
            <a href = "{{ $actionUrl }}" class = "button">{{$actionText}}</a>
            
            <p>If you did not create an account, no further action is required.</p>
    
            <p>
                Best regards, <br>
               
                {{ config('app.name')}}
            </p>
    
            <p>
                <hr>
                <span class = "break-all">
                <strong>If you’re having trouble clicking the link, copy and paste the URL below into your web browser:</strong><br/>
                <em>{{$actionUrl}}</em>
            </p>
    
            
    
        </body>
    
    </html>

Шаг 3

Добавьте следующий метод в User model

class User extends Authenticatable implements MustVerifyEmail
   {
    use HasFactory, Notifiable;

    ...
    ...
    ...

    public function sendEmailVerificationNotification()
    {
        $this->notify(new \App\Notifications\UserVerifyNotification(Auth::user()));  //pass the currently logged in user to the notification class
    }

}

Объяснение

  1. При регистрации нового пользователя вызывается событие Зарегистрировано (Illuminate\Auth\Events).
  2. Внутри EventServiceProvider есть слушатель (App\Providers\EventServiceProvider), который слушает зарегистрированное событие. 1. После завершения регистрации он вызывает метод SendEmailVerificationNotification (Illuminate\Auth\Listeners\SendEmailVerificationNotification).
  3. Слушатель (шаг 2) вызывает метод sendEmailVerificationNotification() из библиотеки Illuminate\Auth\Listeners\SendEmailVerificationNotification
  4. Теперь мы переопределяем функцию sendEmailVerificationNotification() на шаге: 3 и указываем, что мы хотели бы использовать наш собственный класс уведомлений, который мы сделали ранее на шаге: 1
  5. Класс уведомления получает «ссылку для подтверждения» и вызывает колонку «проверка пользователем», чтобы отправить электронное письмо с необходимой ссылкой, как определено в шаге: 2.
  6. Вам нужно будет добавить маршруты, необходимые для проверки. Просто добавьте следующий маршрут в файл web.php
    Auth::routes([
        'verify' => true,
        'register' => true,
    ]);

Спасибо, Брув! Você é demais!

Mateus Gonçalves 28.03.2021 22:34

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