我刚刚升级到Laravel 5.7,现在我正在使用内置的电子邮件验证。但是,有两件事我无法弄清,主要问题是如何自定义发送给用户的电子邮件以验证其电子邮件?如果用户更改了电子邮件,我也无法弄清楚如何启动发送该电子邮件,但是我可以将其保存在另一个线程中。
答案 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
}
}
说明
Illuminate\Auth\Events
)。EventServiceProvider
内部有一个监听器(App\Providers\EventServiceProvider)
用于监听 Registered 事件。1. 注册完成后,它会调用 SendEmailVerificationNotification
方法(Illuminate\Auth\Listeners\SendEmailVerificationNotification
)。< /li>
sendEmailVerificationNotification()
中的 Illuminate\Auth\Listeners\SendEmailVerificationNotification
方法sendEmailVerificationNotification()
函数,并表明我们希望使用我们自己的通知类,这是我们之前在步骤 1 中创建的 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
类,则可以在sendEmailVerificationNotification
(User
)模型上覆盖Authenticatable
方法(来自{{1} }特质。
第二个问题:
您应该拥有的MustVerifyEmail
(VerificationController
)有一个名为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。
作为以电子邮件为主题的常规快速入门(Laravel 5.7),您可以:
php artisan vendor:publish --tag=laravel-mail
发布主题。resources/views/vendor/mail/html/themes/default.css
复制到您自己的文件中。例如resources/views/vendor/mail/html/themes/wayne.css
config/mail.php
,然后在'theme' => 'default'
处将其更改为'theme' => 'wayne'
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传递值