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






К сожалению, это электронное письмо, которое было отправлено, не из «представления», это 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
Думаю, это лучший ответ, потому что вы указали мне более быстрое решение
Если вы хотите добавить проверку электронной почты в 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 и выполнить некоторые дополнительные работы, чтобы выполнить свою работу.
Также взгляните на 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.
Немного опираясь на ответ Эндрю Эрлса, вы также можете опубликовать все почтовые компоненты уценки, используемые приложением, с помощью этой команды:
php artisan vendor:publish --tag=laravel-mail
Как только это будет сделано, у вас будет ряд файлов html и markdown, которые нужно изменить в resources/views/vendor/mail. Это позволит вам изменить общий макет электронной почты, а также «тему» CSS. Я очень рекомендую внимательно прочитать Почтовые документы - Настройка компонентов.
В качестве общего быстрого старта по тематике электронной почты (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.cssconfig/mail.php и там, где вы видите 'theme' => 'default', измените его на 'theme' => 'wayne'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
Никогда не редактируйте файлы каталога поставщиков, самая большая ошибка в мире.
Редактирование файлов внутри каталога vendor не является хорошей идеей, потому что файлы перезаписываются после обновления ваших зависимостей через composer update.
Производитель изменится при обновлении с помощью композитора. Никогда не пытайтесь редактировать файлы поставщика.
Интерфейс interface MustVerifyEmail позволяет вам переопределить указанные здесь функции. Так что вам не нужно редактировать какие-либо файлы /vendor/. Вместо этого скопируйте любой метод, который вам нравится, из этого интерфейса в модель пользователя, а затем скопируйте файлы поставщиков, которые вам нужны, и вставьте их в эту функцию в модели пользователя ...
Чтобы отправить письмо с подтверждением, вы можете просто использовать следующий код:
// 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
}
}
Объяснение
Illuminate\Auth\Events).EventServiceProvider есть слушатель (App\Providers\EventServiceProvider), который слушает зарегистрированное событие. 1. После завершения регистрации он вызывает метод SendEmailVerificationNotification (Illuminate\Auth\Listeners\SendEmailVerificationNotification).sendEmailVerificationNotification() из библиотеки Illuminate\Auth\Listeners\SendEmailVerificationNotificationsendEmailVerificationNotification() на шаге: 3 и указываем, что мы хотели бы использовать наш собственный класс уведомлений, который мы сделали ранее на шаге: 1 Auth::routes([
'verify' => true,
'register' => true,
]);
Спасибо, Брув! Você é demais!
Спасибо за вашу помощь. Ты определенно направил меня на верный путь. Я еще не реализовал вопрос / ответ 1, но для вопроса 2 очень просто просто вызвать метод в модели User. $ user-> sendEmailVerificationNotification (); Я работаю над вопросом 1 и опубликую результаты.