Ich habe gerade ein Upgrade auf Laravel 5.7 durchgeführt und verwende jetzt die integrierte E-Mail-Bestätigung. Es gibt jedoch zwei Dinge, die ich nicht herausfinden konnte, und das Hauptproblem ist, wie kann ich die E-Mail anpassen, die zum Überprüfen der E-Mail an den Benutzer gesendet wird? Ich kann auch nicht herausfinden, wie ich das Senden dieser E-Mail einleiten soll, wenn die Benutzer ihre E-Mail ändern, aber ich kann sie für einen anderen Thread speichern.
Wenn Sie die E-Mail-Bestätigung in Laravel 5.7 hinzufügen möchten, empfiehlt es sich, Illuminate\Contracts\Auth\MustVerifyEmail
zu implementieren und die Illuminate\Auth\MustVerifyEmail
-Eigenschaft des App\User
-Modells zu verwenden.
Um ein benutzerdefiniertes Verhalten vorzunehmen, können Sie die Methode sendEmailVerificationNotification
überschreiben. Diese Methode benachrichtigt den erstellten Benutzer durch Aufrufen der Methode notify
und übergibt eine neue Instanz der Klasse Notifications\MustVerifyEmail
als Parameter.
Sie können eine benutzerdefinierte Benachrichtigung erstellen, die als Parameter an die $this->notify()
innerhalb der sendEmailVerificationNotification-Methode in Ihrem Benutzermodell übergeben wird:
public function sendEmailVerificationNotification()
{
$this->notify(new App\Notifications\CustomVerifyEmail);
}
... dann können Sie in Ihrer CustomVerifyEmail
-Benachrichtigung festlegen, wie die Überprüfung durchgeführt wird. Sie können den erstellten Benutzer benachrichtigen, indem Sie eine E-Mail mit einer benutzerdefinierten notification.route senden, die alle gewünschten Parameter übernimmt.
Benachrichtigungsprozess für E-Mail-Bestätigung
Wenn ein neuer Benutzer sich anmeldet, wird ein Illuminate\Auth\Events\Registered
-Ereignis im App\Http\Controllers\Auth\RegisterController
ausgegeben, und dieses Registered
-Ereignis verfügt über einen Listener mit dem Namen Illuminate\Auth\Listeners\SendEmailVerificationNotification
, der im App\Providers\EventServiceProvider
registriert ist:
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
]
];
Der Listener SendEmailVerificationNotification
prüft, ob der $ user - der in der Laravel-Standardauthentifizierung App\Http\Controllers\Auth\RegisterController
als Parameter an new Registered($user = $this->create($request->all()))
übergeben wird - eine Instanz von Illuminate\Contracts\Auth\MustVerifyEmail
ist. Dies ist der Name der Eigenschaft, die Laravel im App\User
-Modell vorschlägt, wenn Sie es bereitstellen möchten Standard-E-Mail-Bestätigung und prüfen, ob $user
noch nicht verifiziert ist. Wenn dies alles passiert, wird die sendEmailVerificationNotification
-Methode für diesen Benutzer aufgerufen:
if ($event->user instanceof MustVerifyEmail && !$event->user->hasVerifiedEmail()) {
$event->user->sendEmailVerificationNotification();
}
Ich denke, der einfachste Weg, dies zu tun, besteht darin, eine neue Benachrichtigung mit den Dokumenten hier vorzunehmen: https://laravel.com/docs/5.7/notifications#creating-notifications
Dann überschreiben Sie die Funktion:
public function sendEmailVerificationNotification()
{
$this->notify(new App\Notifications\CustomEmailNotification);
}
Im Benutzermodell.
Oder du kannst
php artisan vendor:publish --tag=laravel-notifications
Dadurch werden die Vorlagen in das Verzeichnis resources/views/vendor/Notifications kopiert und Sie können sie dort ändern
Für einen schnellen und einfachen Weg:
php artisan vendor:publish --tag=laravel-notifications
Es erstellt eine neue Datei in:
\resources\views\vendor\notifications
Dies ist Larawels Email-Platte. Sie können es ändern und anpassen.
Navigieren Sie zu diesen Dateien
vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php
vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php
und dann anpassen ... Sie können sogar einen Konstruktor in vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php .__ einführen und den Wert durch vendor/laravel/framework/src/übergeben. Illuminate/Auth/MustVerifyEmail.php
Aufbauend auf der Antwort von Andrew Earls können Sie mit diesem Befehl auch alle von der Anwendung verwendeten Markdown-E-Mail-Komponenten veröffentlichen:
php artisan vendor:publish --tag=laravel-mail
Sobald dies erledigt ist, haben Sie eine Reihe von HTML- und Markdown-Dateien, die Sie in resources/views/vendor/mail
ändern können. Auf diese Weise können Sie das gesamte E-Mail-Layout ändern und das CSS gestalten. Ich würde dringend empfehlen, die Mail-Dokumente gut zu lesen - Anpassen der Komponenten .
Als allgemeine E-Mail-Kurzanleitung (Laravel 5.7) können Sie:
php artisan vendor:publish --tag=laravel-mail
.resources/views/vendor/mail/html/themes/default.css
in Ihre eigene Datei. z. B. resources/views/vendor/mail/html/themes/wayne.css
config/mail.php
und ändern Sie 'theme' => 'default'
in 'theme' => 'wayne'
.wayne.css
, um Ihre E-Mails neu zu gestalten.Hoffe das hilft jemandem.
Um eine Bestätigungs-E-Mail zu senden, können Sie einfach den folgenden Code verwenden:
// send new verification email to user
$user->sendEmailVerificationNotification();
Leider ist diese E-Mail, die versendet wird, nicht aus einer "Ansicht", es ist eine Notification
, die eigentlich inline gebaut wird. Hier wird es derzeit erstellt, wenn es gesendet werden muss: Illuminate\Auth\Notifications\[email protected]
. Diese bestimmte Klasse verfügt über einen statischen Rückruf, der festgelegt werden kann, um diese E-Mail zu erstellen, anstatt sie zuzulassen.
In einem Service Provider in der boot
-Methode müssen Sie dieser Klasse einen Rückruf zuweisen:
Etwas "wie" könnte funktionieren:
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.'));
});
}
Da dies eine Benachrichtigung ist, sollten Sie weitere Optionen zum Anpassen haben.
Wenn Sie Ihre eigene Notification
-Klasse verwenden möchten, können Sie die sendEmailVerificationNotification
-Methode im User
(Authenticatable
) -Modell überschreiben (dies ist aus dem Merkmal MustVerifyEmail
).
Zweite Frage:
Die VerificationController
(App\Http\Controllers\Auth\VerificationController
), die Sie verwenden sollten, verfügt über eine Methode mit dem Namen resend
(aus dem Merkmal VerifiesEmails
), die für diesen Zweck als guter Kandidat erscheint.
Sie sollten Routen für diese Verifizierungsrouten über Auth::routes(['verify' => true]);
einrichten.
Hinweis:
Das Verifikationssystem verwendet ein Feld in der users
-Tabelle email_verified_at
in 5.7, um dies zu markieren. Sie möchten sicherstellen, dass Sie dieses Feld haben. Wenn der Benutzer die E-Mail-Adresse ändert, können Sie diese null
ändern und dann auf die resend
-Route umleiten, um die neue Bestätigung zu senden. Dies versetzt sie jedoch in einen "ungeprüften" Zustand, bis sie sich erneut verifizieren, wenn dies der Fall ist.
Update:
Anscheinend waren wir auf dem richtigen Weg. Ich habe diese SO Antwort gefunden, die über ähnliche Dinge geht:
Ändern des Standardfelds "Betreff" für die Bestätigungs-E-Mail in laravel 5.7