WellGatse
a posé

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

mr_wilfried
a répondu

Bien sur que tu dois ajouter des variables d'environement dans ton fichier .env, notament :

1MAIL_MAILER=smtp
2MAIL_HOST=mailpit
3MAIL_PORT=1025
4MAIL_USERNAME=null
5MAIL_PASSWORD=null
6MAIL_ENCRYPTION=null
7MAIL_FROM_ADDRESS="hello@example.com"
8MAIL_FROM_NAME="${APP_NAME}"
1MAIL_MAILER=smtp
2MAIL_HOST=mailpit
3MAIL_PORT=1025
4MAIL_USERNAME=null
5MAIL_PASSWORD=null
6MAIL_ENCRYPTION=null
7MAIL_FROM_ADDRESS="hello@example.com"
8MAIL_FROM_NAME="${APP_NAME}"

Qui te seront fournis par ton mail provider!

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

darwin_nathan
a répondu

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.

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

darwin_nathan
a répondu

Ou alors tu peux utiliser les methodes preconcus de Laravel (et meme les customiser a ta guise).

1// Dans ton controlleur
2if (! $user->hasVerifiedEmail()) {
3 $user->sendEmailVerificationNotification();
4}
1// Dans ton controlleur
2if (! $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 User
2 
3use App\Notifications;
4 
5class User extends Authenticable //...
6{
7 public function sendEmailVerificationNotification()
8 {
9 $this->notify(new Notifications\EmailVerificationNotification);
10 }
11}
1// Model User
2 
3use App\Notifications;
4 
5class User extends Authenticable //...
6{
7 public function sendEmailVerificationNotification()
8 {
9 $this->notify(new Notifications\EmailVerificationNotification);
10 }
11}

EmailVerificationNotification

1<?php
2 
3namespace App\Notifications;
4 
5use 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;
11 
12class EmailVerificationNotification extends VerifyEmail
13{
14 // use Queueable;
15 
16 public function via($notifiable): array
17 {
18 return ['mail'];
19 }
20 
21 // Je refais pour que le lien du mail redirige vers le front
22 public function toMail($notifiable)
23 {
24 $frontendUrl = env('FRONTEND_URL');
25 $verificationUrl = $this->verificationUrl($notifiable);
26 // Remplacer l'URL backend par celle du frontend
27 $customUrl = "{$frontendUrl}/verify-email?url=".urlencode($verificationUrl);
28 
29 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 }
35 
36 // Je refais cette methode car j'ai custom la route de verification d'email
37 protected function verificationUrl($notifiable)
38 {
39 if (static::$createUrlCallback) {
40 return call_user_func(static::$createUrlCallback, $notifiable);
41 }
42 
43 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<?php
2 
3namespace App\Notifications;
4 
5use 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;
11 
12class EmailVerificationNotification extends VerifyEmail
13{
14 // use Queueable;
15 
16 public function via($notifiable): array
17 {
18 return ['mail'];
19 }
20 
21 // Je refais pour que le lien du mail redirige vers le front
22 public function toMail($notifiable)
23 {
24 $frontendUrl = env('FRONTEND_URL');
25 $verificationUrl = $this->verificationUrl($notifiable);
26 // Remplacer l'URL backend par celle du frontend
27 $customUrl = "{$frontendUrl}/verify-email?url=".urlencode($verificationUrl);
28 
29 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 }
35 
36 // Je refais cette methode car j'ai custom la route de verification d'email
37 protected function verificationUrl($notifiable)
38 {
39 if (static::$createUrlCallback) {
40 return call_user_func(static::$createUrlCallback, $notifiable);
41 }
42 
43 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.

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

WellGatse
a répondu

D'accord, merci. Sinon, je n'aurais rien à configuré dans le fihchier .env?

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer cette réponse ? Cette action est irréversible.

Il faut Se connecter ou Créer un compte pour participer à cette conversation.

Confirmer la suppression

Êtes-vous sûr de vouloir supprimer ce sujet ? Cette action est irréversible.