Les mails et les notifications
Mailables, notifications et queues
Concepts Théoriques
SunuLearn doit envoyer des mails : bienvenue à l'inscription, confirmation d'inscription à une formation, contact. Laravel offre un système de mails élégant avec des classes Mailable et des templates Blade.
Créer un Mailable
php artisan make:mail WelcomeMail// app/Mail/WelcomeMail.php
class WelcomeMail extends Mailable
{
use Queueable, SerializesModels;
public function __construct(public User $user) {}
public function envelope(): Envelope
{
return new Envelope(subject: 'Bienvenue sur SunuLearn !');
}
public function content(): Content
{
return new Content(view: 'emails.welcome');
}
}Le template :
<!-- resources/views/emails/welcome.blade.php -->
<h1>Bienvenue {{ $user->name }} !</h1>
<p>Votre compte SunuLearn est créé. Explorez nos formations gratuites :</p>
<a href="{{ route('formations.index') }}">Voir les formations</a>Envoyer :
use Illuminate\Support\Facades\Mail;
Mail::to($user->email)->send(new WelcomeMail($user));Configuration mail (.env)
MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=contact@sunulearn.com
MAIL_PASSWORD=app_password_ici
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=contact@sunulearn.com
MAIL_FROM_NAME="SunuLearn"Pour le développement, utilisez Mailtrap (mailtrap.io) ou le driver log :
MAIL_MAILER=logLes mails s'affichent dans storage/logs/laravel.log au lieu d'être envoyés.
Notifications — multi-canal
Les notifications peuvent aller sur plusieurs canaux (mail, base de données, SMS) :
php artisan make:notification EnrollmentConfirmationclass EnrollmentConfirmation extends Notification
{
public function __construct(public Formation $formation) {}
public function via(object $notifiable): array
{
return ['mail', 'database'];
}
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage)
->subject("Inscription confirmée — {$this->formation->title}")
->greeting("Bonjour {$notifiable->name}")
->line("Vous êtes inscrit à {$this->formation->title}.")
->action('Commencer', route('formations.show', $this->formation));
}
}Envoyer :
$user->notify(new EnrollmentConfirmation($formation));