Laravel

Envoi de courriels

Création de la Class et du Template

Nous souhaitons envoyer un courriel à un utilisateur quand il a créé un nouvel article sur le blogue.

Avec Artisan, on crée la Class PostCreated et le template de vue qui sera dans /resources/views/emails/post-created.blade.php

php artisan make:mail PostCreated -m 'emails.post-created'

La Class PostCreated est dans le dossier /app/Mail/PostCreated.php

La vue post-created.blade.php permet d'écrire le contenu du courriel en Markdown ⇒ https://fr.wikipedia.org/wiki/Markdown

Envoyer un courriel à partir d'un contrôleur

Exemple dans le contrôleur PostController.php, nous envoyons un courriel à la fin de la méthode store(), une fois que l'article est enregistré

use Illuminate\Support\Facades\Mail;
use App\Mail\PostCreated;
use Illuminate\Support\Facades\Auth;
...
public function store(Request $request)
{   
...
    $post->categories()->sync(request()->get('categories'));

    Mail::to(Auth::user()->email)->send(
        new PostCreated($post)
    );

    return redirect('/posts')->with('status', "L'article a bien été créé");;
}

Envoyer un courriel à partir d'un modèle

En général, on essai de garder les contrôleurs les plus simples possibles. Envoyer des courriels à partir du contrôleur fonctionne mais si on doit effectuer cette action dans plusieurs endroit dans le code, il est préférable d'utiliser le modèle afin de centraliser l'envoi de courriels.

Pour cela, on utitise les événements d'Eloquent ⇒ https://laravel.com/docs/8.x/eloquent#events

Plusieurs types d'événements peuvent être déclenchés par Eloquent: retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored

Nous allons utiliser l'événement created dans le modèle Post.php

...
use Illuminate\Support\Facades\Mail;
use App\Mail\PostCreated;

class Post extends Model
{
    ...

    protected static function boot()
    {
        parent::boot();

        static::created(function($post) {
            Mail::to(Auth::user()->email)->send(
                new PostCreated($post)
            );
        });

    }

Maintenant, quelque soit la partie de l'application qui crée l'article, le courriel sera envoyé.

Passer des informations dans le courriel

Dans le modèle Post.php, quand on instancie la class PostCreated($post), on envoi $post.

Il faut maintenant modifier la Class /app/Mail/PostCreated.php afin qu'elle envoie les informations ($post) à la vue qui gère le courriel.

class PostCreated extends Mailable
{
    use Queueable, SerializesModels;

    public $post;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($post)
    {
        $this->post = $post;
    }

Voici un exemple de vue pour afficher le titre de l'article et un bouton qui permet d'aller voir l'article.

@component('mail::message')
# Titre: {{ $post->title}}

Vous avez écrit un nouvel article

@component('mail::button', ['url' => url('/post/' . $post->id)])
voir l'article
@endcomponent

Merci !<br>
{{ config('app.name') }}
@endcomponent