Chapitre 14Projet SunuLearn

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=log

Les 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 EnrollmentConfirmation
class 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));