web-dev-qa-db-fra.com

Comment personnaliser l'email de vérification de l'email de Laravel 5.7?

Je viens de passer à Laravel 5.7 et maintenant je me sers de la vérification intégrée du courrier électronique. Cependant, il y a deux choses que je n'ai pas pu comprendre et le problème principal est comment puis-je personnaliser le courrier électronique envoyé à l'utilisateur pour qu'il vérifie son courrier électronique? Je ne peux pas non plus comprendre comment initier l'envoi de cet email si les utilisateurs changent leur email mais je peux le sauvegarder pour un autre thread.

10
Wayne Fulcher

Lorsque vous souhaitez ajouter la vérification de courrier électronique dans Laravel 5.7, la méthode suggérée consiste à implémenter Illuminate\Contracts\Auth\MustVerifyEmail et à utiliser le trait Illuminate\Auth\MustVerifyEmail sur le modèle App\User.

Pour créer un comportement personnalisé, vous pouvez remplacer la méthode sendEmailVerificationNotification, qui est la méthode qui informe l'utilisateur créé en appelant la méthode notify, et transmet en tant que paramètre une nouvelle instance de la classe Notifications\MustVerifyEmail.

Vous pouvez créer une notification personnalisée qui sera transmise en tant que paramètre à la fonction $this->notify() dans la méthode sendEmailVerificationNotification dans votre modèle utilisateur:

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

... alors dans votre notification CustomVerifyEmail, vous pouvez définir le mode de traitement de la vérification. Vous pouvez notifier l'utilisateur créé en envoyant un courrier électronique avec un fichier verification.route personnalisé, qui prendra les paramètres de votre choix.

Processus de notification de vérification de courrier électronique

Lorsqu'un nouvel utilisateur s'inscrit, un événement Illuminate\Auth\Events\Registered est émis dans le App\Http\Controllers\Auth\RegisterController et cet événement Registered a un écouteur appelé Illuminate\Auth\Listeners\SendEmailVerificationNotification qui est enregistré dans le App\Providers\EventServiceProvider:

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

L'écouteur SendEmailVerificationNotification vérifie si l'utilisateur $ - qui est passé en tant que paramètre à new Registered($user = $this->create($request->all())) dans l'authentification par défaut de Laravel App\Http\Controllers\Auth\RegisterController - est une instance de Illuminate\Contracts\Auth\MustVerifyEmail qui est le nom de la caractéristique que Laravel suggère d'utiliser dans le modèle App\User lorsque vous souhaitez fournir vérification de l'email par défaut et vérifiez également que $user n'est pas déjà vérifié. Si tout se passe bien, la méthode sendEmailVerificationNotification est appelée sur cet utilisateur:

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

Je pense que le moyen le plus simple de faire cela est de faire une nouvelle notification en utilisant les documents ici: https://laravel.com/docs/5.7/notifications#creating-notifications

Puis remplacez la fonction:

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

Dans le modèle des utilisateurs.

Ou tu peux 

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

Cela copiera les modèles dans le répertoire resources/views/vendor/notifications et vous pourrez les modifier à cet emplacement.

3
Andrew Earls

Pour un moyen rapide et facile: 

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

Il crée un nouveau fichier dans: 

\resources\views\vendor\notifications

Ceci est le modèle de courrier électronique de Laravel. Vous pouvez le changer et le personnaliser.

2
Tolga

Accédez à ces fichiers

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

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

et ensuite le personnaliser ... vous pouvez même introduire un constructeur dans vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php et transmettre la valeur via vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php

par exemple:  Created my own constructor  Utilized the user array values passed to the constructor  Passing the constructor value from the

0
Nana Yaw Zaza Oduro

En s'appuyant légèrement sur la réponse d'Andrew Earls, vous pouvez également publier tous les composants de courrier de démarquage utilisés par l'application avec cette commande: 

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

Une fois que cela est fait, vous aurez une série de fichiers html et markdown à modifier dans resources/views/vendor/mail. Cela vous permettra de modifier la disposition générale de l'e-mail et également de "thème" le CSS. Je vous recommande vivement de lire attentivement les documents Mail - Personnalisation des composants .

CSS thématisation

En tant que guide de démarrage rapide de la messagerie électronique (Laravel 5.7), vous pouvez: 

  1. Publiez le thème avec php artisan vendor:publish --tag=laravel-mail.
  2. Copiez resources/views/vendor/mail/html/themes/default.css dans votre propre fichier. par exemple resources/views/vendor/mail/html/themes/wayne.css
  3. Éditez config/mail.php et où vous voyez 'theme' => 'default' changez-le en 'theme' => 'wayne'
  4. Modifiez wayne.css pour redéfinir le style de vos courriels.

J'espère que ça aide quelqu'un. 

0
Mere Development

Malheureusement, cet e-mail envoyé ne provient pas d'une "vue", il s'agit d'une Notification construite en ligne. C’est à cet endroit qu’il est actuellement construit lorsqu’il doit être envoyé: Illuminate\Auth\Notifications\VerifyEmail@toMail. Cette classe particulière a un rappel statique qui peut être défini pour construire cet email au lieu de le laisser le faire.

Dans un fournisseur de services de la méthode boot, vous devrez affecter un rappel à cette classe:

Quelque chose "comme" cela pourrait fonctionner:

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

    });
}

Comme il s'agit d'une notification, vous devriez avoir plus d'options pour la personnaliser.

Si vous souhaitez utiliser votre propre classe Notification, vous pouvez remplacer la méthode sendEmailVerificationNotification sur le modèle User (Authenticatable) (elle provient du trait MustVerifyEmail).

Deuxième question:

La VerificationController (App\Http\Controllers\Auth\VerificationController) que vous devriez avoir a une méthode nommée resend (du trait VerifiesEmails) qui ressemble à un bon candidat à cet effet.

Vous devez configurer les itinéraires pour ces itinéraires de vérification via Auth::routes(['verify' => true]);

Remarque:

Le système de vérification utilise un champ de la table usersemail_verified_at dans 5.7 pour marquer ceci. Vous voulez vous assurer que vous avez ce champ. Lorsque l'utilisateur change d'adresse e-mail, je suppose que vous pouvez créer cette variable null puis les rediriger vers la route resend afin d'envoyer la nouvelle vérification. Cela les mettra dans un état "non vérifié" jusqu'à ce qu'ils revérifient, si c'est ce que vous avez l'intention de faire.

Mettre à jour:

On dirait que nous allions dans la bonne voie. J'ai trouvé cette SO réponse qui aborde des choses similaires:

Changer le champ “sujet” par défaut pour l'email de vérification dans laravel 5.7

0
lagbox