réponses
717 vues
confirmation d'adresse mail
Salut la communauté. je veux impléter un systhème de confirmation d'email dans laravel, je travail sur la version 12, je suis en production et je veux qu'il s'agisse des emails réels, comment faire? NB: je ne travail pas avec blade, je travils avec les api
Bien sur que tu dois ajouter des variables d'environement dans ton fichier .env, notament :
1MAIL_MAILER=smtp2MAIL_HOST=mailpit3MAIL_PORT=10254MAIL_USERNAME=null5MAIL_PASSWORD=null6MAIL_ENCRYPTION=null7MAIL_FROM_ADDRESS="hello@example.com"8MAIL_FROM_NAME="${APP_NAME}"1MAIL_MAILER=smtp2MAIL_HOST=mailpit3MAIL_PORT=10254MAIL_USERNAME=null5MAIL_PASSWORD=null6MAIL_ENCRYPTION=null7MAIL_FROM_ADDRESS="hello@example.com"8MAIL_FROM_NAME="${APP_NAME}"
Qui te seront fournis par ton mail provider!
Tout dépend de la manière avec laquelle tu veux faire ta vérification de courriel. tu peux premièrement utiliser un système où tu envoies un code OTP à l'utilisateur à partir d'un mail et ensuite dans le mail contiendra un lien avec le code OTP. et une date d'expiration que tu auras eu à stocker un BD. lorsqu'il ouvrira le lien si le TP est encore valide par rapport à la date d'expiration que tu as décidé alors tu mets une valuer au champ email_verified_at.
Ou alors tu peux utiliser les methodes preconcus de Laravel (et meme les customiser a ta guise).
1// Dans ton controlleur2if (! $user->hasVerifiedEmail()) {3 $user->sendEmailVerificationNotification();4}1// Dans ton controlleur2if (! $user->hasVerifiedEmail()) {3 $user->sendEmailVerificationNotification();4}
La methode sendEmailVerificationNotification est deja definii par defaut et utilise aussi les templates de mail par defaut de Laravel, si tu veux les customiser
1// Model User23use App\Notifications;45class User extends Authenticable //...6{7 public function sendEmailVerificationNotification()8 {9 $this->notify(new Notifications\EmailVerificationNotification);10 }11}1// Model User23use App\Notifications;45class User extends Authenticable //...6{7 public function sendEmailVerificationNotification()8 {9 $this->notify(new Notifications\EmailVerificationNotification);10 }11}
EmailVerificationNotification
1<?php23namespace App\Notifications;45use Carbon\Carbon;6use Illuminate\Auth\Notifications\VerifyEmail;7use Illuminate\Bus\Queueable;8use Illuminate\Notifications\Messages\MailMessage;9use Illuminate\Notifications\Notification;10use Illuminate\Support\Facades\URL;1112class EmailVerificationNotification extends VerifyEmail13{14 // use Queueable;1516 public function via($notifiable): array17 {18 return ['mail'];19 }2021 // Je refais pour que le lien du mail redirige vers le front22 public function toMail($notifiable)23 {24 $frontendUrl = env('FRONTEND_URL');25 $verificationUrl = $this->verificationUrl($notifiable);26 // Remplacer l'URL backend par celle du frontend27 $customUrl = "{$frontendUrl}/verify-email?url=".urlencode($verificationUrl);2829 return (new MailMessage)30 ->subject(__('notifications.email_verification_subject'))31 ->line(__('notifications.email_verification_line'))32 ->action(__('notifications.email_verification_action'), $customUrl)33 ->line(__('notifications.email_verification_no_action'));34 }3536 // Je refais cette methode car j'ai custom la route de verification d'email37 protected function verificationUrl($notifiable)38 {39 if (static::$createUrlCallback) {40 return call_user_func(static::$createUrlCallback, $notifiable);41 }4243 return URL::temporarySignedRoute(44 'user:verification.verify', // ICI...45 Carbon::now()->addMinutes(60),46 [47 'id' => $notifiable->getKey(),48 'hash' => sha1($notifiable->getEmailForVerification()),49 ]50 );51 }52}1<?php23namespace App\Notifications;45use Carbon\Carbon;6use Illuminate\Auth\Notifications\VerifyEmail;7use Illuminate\Bus\Queueable;8use Illuminate\Notifications\Messages\MailMessage;9use Illuminate\Notifications\Notification;10use Illuminate\Support\Facades\URL;1112class EmailVerificationNotification extends VerifyEmail13{14 // use Queueable;1516 public function via($notifiable): array17 {18 return ['mail'];19 }2021 // Je refais pour que le lien du mail redirige vers le front22 public function toMail($notifiable)23 {24 $frontendUrl = env('FRONTEND_URL');25 $verificationUrl = $this->verificationUrl($notifiable);26 // Remplacer l'URL backend par celle du frontend27 $customUrl = "{$frontendUrl}/verify-email?url=".urlencode($verificationUrl);2829 return (new MailMessage)30 ->subject(__('notifications.email_verification_subject'))31 ->line(__('notifications.email_verification_line'))32 ->action(__('notifications.email_verification_action'), $customUrl)33 ->line(__('notifications.email_verification_no_action'));34 }3536 // Je refais cette methode car j'ai custom la route de verification d'email37 protected function verificationUrl($notifiable)38 {39 if (static::$createUrlCallback) {40 return call_user_func(static::$createUrlCallback, $notifiable);41 }4243 return URL::temporarySignedRoute(44 'user:verification.verify', // ICI...45 Carbon::now()->addMinutes(60),46 [47 'id' => $notifiable->getKey(),48 'hash' => sha1($notifiable->getEmailForVerification()),49 ]50 );51 }52}
Apres ceci tu n'as qu'a faire les routes (les miennes sont API).
api.php
1Route::prefix('user')->as('user:')->group(function(){2 Route::post('/send-verification-mail', [Api\UserController::class, 'resend'])->middleware('throttle:6,1')->name('verifcation.send');3 Route::post('/email/verify/{id}/{hash}', [Api\UserController::class, 'verifyEmail'])->middleware('signed')->name('verification.verify');4});1Route::prefix('user')->as('user:')->group(function(){2 Route::post('/send-verification-mail', [Api\UserController::class, 'resend'])->middleware('throttle:6,1')->name('verifcation.send');3 Route::post('/email/verify/{id}/{hash}', [Api\UserController::class, 'verifyEmail'])->middleware('signed')->name('verification.verify');4});
Tu dois preciser le middleware signed sur la route de verification.
D'accord, merci. Sinon, je n'aurais rien à configuré dans le fihchier .env?
Il faut Se connecter ou Créer un compte pour participer à cette conversation.