Blog ENI : Toute la veille numérique !
Jusqu'à ce soir ! : -25€ dès 75€ sur les livres en ligne, vidéos... code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Laravel
  3. Envoyer des e
Extrait - Laravel Un framework efficace pour développer vos applications PHP (2e édition)
Extraits du livre
Laravel Un framework efficace pour développer vos applications PHP (2e édition) Revenir à la page d'achat du livre

Envoyer des e-mails

Configuration d’un environnement local

Avant de commencer à envoyer des e-mails dans une application, il faut correctement configurer l’environnement de travail pour tester sereinement l’envoi d’e-mails en local. Un environnement de travail bien préparé permet de vérifier le contenu des e-mails sans les envoyer réellement, afin d’éviter des déconvenues comme, par exemple, un envoi massif à des utilisateurs réels par inadvertance. Les mécanismes de gestion des e-mails en local mis en place par les équipes de développement peuvent être contraignants : ils envahissent une boîte e-mail dite de test ou alors les e-mails ne partent pas du tout et il faut espérer qu’en production cela fonctionne.

Laravel permet de désactiver de différentes manières l’envoi effectif d’e-mails pendant le développement, sans avoir à ajouter une ligne de code dans l’application. Il faudra simplement changer une valeur de configuration sur l’environnement local.

1. Mailpit

Bien qu’il existe plusieurs approches pour gérer l’envoi d’e-mail en local, Laravel Sail permet l’utilisation du service Mailpit. Lors de la création d’un nouveau projet Laravel, il fera partie des services installés par défaut (pour plus d’informations, se référer...

Préparer des e-mails

1. Création de la classe Mailable

Avant d’envoyer un e-mail, il faut créer une classe qui étend la classe Illuminate\Mail\Mailable avec la commande Artisan make:mail. En effet, chaque type d’e-mail dans Laravel est représenté par une classe.

Création d’un e-mail avec Artisan

sail artisan make:mail Invitation  

Les classes d’e-mails sont créées dans le dossier app/Mail. Une classe d’e-mail contient par défaut plusieurs méthodes en plus du constructeur :

  • La méthode envelope définit l’expéditeur et le sujet de l’e-mail.

  • La méthode content est chargée de retourner le contenu de l’e-mail.

  • La méthode attachments liste les pièces jointes de l’e-mail.

Par ailleurs, la classe utilise les traits Queueable et SerializeModels. Cela permettra de mettre l’e-mail dans une file d’attente, comme vu au chapitre Les files d’attente, en implémentant l’interface ShouldQueue.

La structure d’une classe d’e-mail qui vient d’être créée avec la commande Artisan est présentée dans l’exemple suivant.

Classe App\Mail\Invitation

<?php 
 
namespace App\Mail; 
 
use Illuminate\Bus\Queueable; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use Illuminate\Mail\Mailable; 
use Illuminate\Mail\Mailables\Content; 
use Illuminate\Mail\Mailables\Envelope; 
use Illuminate\Queue\SerializesModels; 
 
class Invitation extends Mailable 
{ 
 
    use Queueable, SerializesModels; 
 
    /** 
     * Create a new message instance. 
     */ 
    public function __construct() 
    { 
 
        // 
 
    } 
 
    /** 
     * Get the message envelope. 
     */ 
    public function envelope(): Envelope 
    { 
 
        return new Envelope( 
            subject:...

Envoyer des e-mails

1. Envoyer un e-mail immédiatement

Pour envoyer un e-mail, on peut utiliser les méthodes statiques to et send de la façade Illuminate\Support\Facades\Mail.

La méthode to accepte en paramètre une adresse e-mail, une instance d’utilisateur ou même plusieurs utilisateurs. Le nom et l’adresse e-mail des destinataires sont automatiquement définis lors de l’envoi de l’e-mail à partir des propriétés name et email des utilisateurs passés en paramètres.

La méthode send prend en paramètre une instance de la classe Mailable. Il s’agit donc des classes qui ont été créées précédemment dans ce chapitre. Dès lors, les paramètres de la classe pourront être passés à l’instance dans le constructeur en fonction du contexte.

Envoyer un message peut se faire directement dans un contrôleur, comme dans l’exemple ci-dessous.

Classe App\Http\Controllers\InvitationController

<?php 
 
namespace App\Http\Controllers; 
 
use App\Mail\Invitation; 
use Illuminate\Support\Facades\Mail; 
 
class InvitationController extends Controller 
{ 
 
    public function invite() 
    { 
 
        // Envoi du mail en direct ...

Utiliser des notifications

En supplément de la prise en charge de l’envoi d’e-mails, Laravel permet également d’envoyer des notifications. Une notification est en général un message court à destination des utilisateurs, faisant suite à une action sur l’application. Par exemple, pour prévenir les administrateurs qu’un nouvel article a été posté, ou qu’un achat a eu lieu sur le site.

Une notification doit être brève, avertissant une personne qu’un événement s’est produit. L’envoi de la notification peut s’effectuer à travers différents canaux de diffusion. Un canal de diffusion peut être, par exemple, un e-mail. Cela permet donc d’envoyer rapidement un e-mail notifiant une action. Mais il est également possible d’envoyer des notifications à destination d’autres canaux de diffusion :

  • vers Slack, un outil de messagerie professionnel ;

  • par SMS, avec l’aide de Vonage ;

  • dans la base de données, pour un affichage dans une interface spécifique.

1. Créer une notification

a. Commande de création

Pour créer une notification, utilisez la commande Artisan make:notification.

Création d’une notification

sail artisan make:notification CommentPosted  

Cette commande a pour effet de créer une classe App\Notifications\CommentPosted qui hérite de Illuminate\Notifications\Notification.

Généralement, une notification est une réaction à un événement. On pourra prendre pour habitude d’appeler les notifications par le nom de l’événement pour une meilleure lisibilité. Ainsi, dans l’exemple précédent, la notification CommentPosted correspond à l’événement : « un commentaire a été posté ».

b. Définir la liste des canaux

Par défaut, lorsqu’on crée une notification, Laravel propose de l’envoyer uniquement via e-mail. Il est possible de remplacer ce canal par un autre ou de cumuler plusieurs canaux. Une notification importante peut être envoyée à la fois par SMS et par e-mail, par exemple. Ou alors cela peut être en fonction des préférences...

Choisir un pilote pour la production

Une fois les tests terminés, il faut choisir un pilote pour envoyer réellement les e-mails en environnement de production.

Par le passé, les applications PHP utilisaient directement la fonction mail. Le serveur envoyait alors lui-même l’e-mail avec l’application sendmail. Les développeurs ou administrateurs avaient la charge de configurer correctement le message et le serveur d’e-mail eux-mêmes, ce qui avait parfois pour effet de faire arriver les e-mails dans les courriers indésirables.

Aujourd’hui, de nombreux services permettent d’envoyer des e-mails qualifiés, par SMTP ou grâce à une API simple, avec un suivi précis de chaque e-mail. C’est pourquoi, pour une application professionnelle, il est préférable de s’appuyer sur un de ces nombreux services. La plupart ont des coûts relativement bas, gratuits pour quelques milliers d’e-mails par mois, ce qui est généralement suffisant pour la phase de lancement d’une application. Par la suite, le coût restera faible et devrait être amorti avec le temps gagné pour l’innovation.

Laravel s’appuie sur la bibliothèque Symfony Mailer (https://github.com/symfony/mailer) pour envoyer les e-mails. Cela permet d’émettre des e-mails de qualité (avec les bons en-têtes formatés...