How to customize the email verification email from Laravel 5.7?

旧巷老猫 提交于 2019-11-29 12:41:55

问题


I just upgraded to Laravel 5.7 and now I am using the built in Email Verification. However there is 2 things I have not been able to figure out and the primary issue is how can I customize the email that is being sent to the user for verifying their email? I also can't figure out how to initiate sending that email if the users changes their email but I can save that for another thread.


回答1:


When you want to add Email Verification in Laravel 5.7 the suggested method is to implement Illuminate\Contracts\Auth\MustVerifyEmail and use the Illuminate\Auth\MustVerifyEmail trait on the App\User Model.

To make some custom behaviour you can override the method sendEmailVerificationNotification which is the method that notifies the created user by calling the method notify, and passes as a parameter a new instance of the Notifications\MustVerifyEmail class.

You can create a custom Notification which will be passed as a parameter to the $this->notify() within the sendEmailVerificationNotification method in your User Model:

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

...then in your CustomVerifyEmail Notification you can define the way the verification will be handled. You can notify created user by sending an email with a custom verification.route which will take any parameters that you want.

Email verification notification process

When a new user signs-up an Illuminate\Auth\Events\Registered Event is emitted in the App\Http\Controllers\Auth\RegisterController and that Registered event has a listener called Illuminate\Auth\Listeners\SendEmailVerificationNotification which is registered in the App\Providers\EventServiceProvider:

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

The SendEmailVerificationNotification listener checks if the $user – which is passed as a parameter to new Registered($user = $this->create($request->all())) in the Laravel default authentication App\Http\Controllers\Auth\RegisterController – is an instance of Illuminate\Contracts\Auth\MustVerifyEmail which is the name of the trait that Laravel suggests is used in the App\User Model when you want to provide default email verification and also check that $user is not already verified. If all that passes, the sendEmailVerificationNotification method is called on that user:

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



回答2:


I think the simple way to do this is to make a new notification using the docs here: https://laravel.com/docs/5.7/notifications#creating-notifications

Then override the function:

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

In the users model.

Or you can

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

This will copy the templates to the resources/views/vendor/notifications directory and you can modify them there




回答3:


For quick and easy way:

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

It's creating a new file in:

\resources\views\vendor\notifications

This is Laravel's email themplate. You can change and customize it.




回答4:


Unfortunately this email that is sent out is not from a "view", it is a Notification that is built inline actually. This is where it is currently built when needing to be sent off: Illuminate\Auth\Notifications\VerifyEmail@toMail. This particular class has a static callback that can be set to build this email instead of letting it do it.

In a Service Provider in the boot method you will need to assign a callback for this class:

Something "like" this might work:

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.'));

    });
}

As this is a notification you should have more options on customizing it.

If you want to use your own Notification class you can override the sendEmailVerificationNotification method on the User (Authenticatable) model (this is from the MustVerifyEmail trait).

Second Question:

The VerificationController (App\Http\Controllers\Auth\VerificationController) that you should have has a method named resend (from the trait VerifiesEmails) that looks like a good candidate for this purpose.

You should have routes setup for these verification routes via Auth::routes(['verify' => true]);

Note:

The verification system uses a field on the users table email_verified_at in 5.7 to mark this. You would want to make sure you have this field. When the user changes email address I suppose you could make this null then redirect them to the resend route, to send off the new verification. This will put them into an "unverified" state though until they reverify, if that is what you intend to happen.

Update:

Seems we were going down the right track. I found this SO answer that goes over similar things:

Changing the default “subject” field for the verification email in laravel 5.7




回答5:


Building slightly on the answer by Andrew Earls, you can also publish all the markdown mail components used by the application with this command:

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

Once that's done you'll have a series of html and markdown files to modify in resources/views/vendor/mail. This will allow you to modify the overall email layout and also 'theme' the CSS. I'd highly recommend having a good read of the Mail docs - Customizing The Components.

CSS theming

As a general email theming quick-start (Laravel 5.7), you can:

  1. Publish the theme with php artisan vendor:publish --tag=laravel-mail .
  2. Copy resources/views/vendor/mail/html/themes/default.css to your own file. e.g resources/views/vendor/mail/html/themes/wayne.css
  3. Edit config/mail.php and where you see 'theme' => 'default' change it to 'theme' => 'wayne'
  4. Edit wayne.css to restyle your emails.

Hope that helps someone.




回答6:


To send verification email you can just use the next code:

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



回答7:


Navigate to these files

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

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

and then customize it. you can even introduce a constructor in vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php and pass value through vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php

eg:



来源:https://stackoverflow.com/questions/52416804/how-to-customize-the-email-verification-email-from-laravel-5-7

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!