如何自Laravel 5.7定制电子邮件验证电子邮件?

时间:2018-09-20 02:42:24

标签: php laravel email email-verification

我刚刚升级到Laravel 5.7,现在我正在使用内置的电子邮件验证。但是,有两件事我无法弄清,主要问题是如何自定义发送给用户的电子邮件以验证其电子邮件?如果用户更改了电子邮件,我也无法弄清楚如何启动发送该电子邮件,但是我可以将其保存在另一个线程中。

9 个答案:

答案 0 :(得分:12)

当您想在 Laravel 5.7 中添加电子邮件验证时,建议的方法是实现Illuminate\Contracts\Auth\MustVerifyEmail并在Illuminate\Auth\MustVerifyEmail模型上使用App\User特性。 / p>

要进行一些自定义行为,您可以覆盖方法sendEmailVerificationNotification,该方法是通过调用方法notify通知创建的用户的方法,并将{{1 }}类。

您可以创建一个自定义通知,该通知将作为参数传递给用户模型中sendEmailVerificationNotification方法中的Notifications\MustVerifyEmail

$this->notify()

...然后在public function sendEmailVerificationNotification() { $this->notify(new App\Notifications\CustomVerifyEmail); } 通知中,您可以定义处理验证的方式。您可以通过发送带有自定义 verification.route 的电子邮件来通知创建的用户,该电子邮件将包含所需的任何参数。

电子邮件验证通知流程

当新用户注册时,CustomVerifyEmail中会发出一个Illuminate\Auth\Events\Registered事件,并且该App\Http\Controllers\Auth\RegisterController事件中有一个名为Registered的侦听器,该侦听器已注册在{{ 1}}:

Illuminate\Auth\Listeners\SendEmailVerificationNotification

App\Providers\EventServiceProvider侦听器检查$ user(在Laravel默认身份验证protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ] ]; 中作为参数传递给SendEmailVerificationNotification的情况)是否是new Registered($user = $this->create($request->all()))的实例,该实例是当您想提供默认的电子邮件验证并检查App\Http\Controllers\Auth\RegisterController尚未验证时,在Illuminate\Contracts\Auth\MustVerifyEmail模型中使用Laravel建议的特征名称。如果所有步骤均通过,则在该用户上调用App\User方法:

$user

答案 1 :(得分:7)

我认为执行此操作的简单方法是使用此处的文档发出新通知: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目录,您可以在此处进行修改

答案 2 :(得分:4)

快速简便的方法:

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

它正在以下位置创建一个新文件:

\resources\views\vendor\notifications

这是Laravel的电子邮件模板。您可以对其进行更改和自定义。

答案 3 :(得分:1)

我将向您展示如何使用自定义视图从头开始自定义用户验证电子邮件,而无需使用任何供应商发布

步骤: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

resources\views\emails 内的电子邮件 (user-verify.blade.php) 创建刀片视图

    <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. 注册新用户时,会调用 Registered 事件 (Illuminate\Auth\Events)。
  2. EventServiceProvider 内部有一个监听器(App\Providers\EventServiceProvider) 用于监听 Registered 事件。1. 注册完成后,它会调用 SendEmailVerificationNotification 方法(Illuminate\Auth\Listeners\SendEmailVerificationNotification)。< /li>
  3. 侦听器(第 2 步)调用库 sendEmailVerificationNotification() 中的 Illuminate\Auth\Listeners\SendEmailVerificationNotification 方法
  4. 我们现在覆盖步骤 3 中的 sendEmailVerificationNotification() 函数,并表明我们希望使用我们自己的通知类,这是我们之前在步骤 1 中创建的
  5. 通知类获取“验证链接”并调用“用户验证”刀片发送包含步骤 2 中定义的必要链接的电子邮件
  6. 您需要添加验证所需的路由。只需在 web.php 文件中添加以下路由
    Auth::routes([
        'verify' => true,
        'register' => true,
    ]);

答案 4 :(得分:0)

不幸的是,这封发送的电子邮件并非来自“视图”,实际上是内嵌的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类,则可以在sendEmailVerificationNotificationUser)模型上覆盖Authenticatable方法(来自{{1} }特质。

第二个问题:

您应该拥有的MustVerifyEmailVerificationController)有一个名为App\Http\Controllers\Auth\VerificationController(来自特征resend的方法),看起来很适合此目的。 / p>

您应该通过VerifiesEmails

为这些验证路线设置路线

注意:

验证系统使用5.7中Auth::routes(['verify' => true]);users上的字段进行标记。您将要确保您具有此字段。当用户更改电子邮件地址时,我想您可以使用此email_verified_at,然后将其重定向到null路由,以发送新的验证。如果您打算这样做,那么这将使它们进入“未经验证”的状态,直到它们重新验证为止。

更新

似乎我们走了正确的路。我发现这个类似问题的答案:

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

答案 5 :(得分:0)

基于Andrew Earls的回答,您还可以使用以下命令发布应用程序使用的所有markdown邮件组件:

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

完成后,您将需要在resources/views/vendor/mail中修改一系列html和markdown文件。这将允许您修改整个电子邮件布局,也可以“主题” CSS。我强烈建议您仔细阅读Mail docs - Customizing The Components

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 :(得分:0)

要发送验证电子邮件,您只需使用下一个代码:

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

答案 7 :(得分:0)

在路线文件中

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

在AppServiceProvider.php文件中

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

        });

    }
}

现在使用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 = 'mymail@gmail.com';
        $name = 'Name';
        $subject = 'verify Email';
        return $this->to($this->user)->subject($subject)->from($address, $name)->
        markdown('emails.verify',['url' => $this->verifyUrl,'user' => $this->user]);
    }
}

在刀片文件中根据需要更改设计,并使用verifyUrl显示验证链接,并使用$ user显示用户信息

感谢,祝您编码愉快:)

答案 8 :(得分:-2)

导航到这些文件

  •   

    供应商/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php

  •   

    供应商/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 constructor Utilized the user array values passed to the constructor Passing the constructor value from the