Laravel 5 : Les emails

Elliott Chiaradia | 16-05-2016

Laravel 5 possède des fonctionnalités très pratiques permettant d'envoyer des mails, donc pas besoin de plugin ! Tout est directement disponible au sein même du framework. Ces mails peuvent être reçus/envoyés depuis un serveur mail standard ou depuis un webservice de messagerie à la gmail.

Dans ce tutoriel, nous allons voir comment envoyer un mail depuis Laravel 5. Puis, un second chapitre permettra d'introduire l'envoi d'un email au contenu dynamique. Finalement, la dernière partie vous montrera comment envoyer un même courriel à plusieurs destinataires.

La première chose à faire consiste à configurer le fichier .env qui se trouve à la racine de votre projet. Les informations comme le MAIL_HOST vous sont normalement fournies si vous utilisez un hébergeur web d'emails, il ne vous reste donc plus qu'à remplir votre MAIL_USERNAME (le nom de votre adresse mail) et le MAIL_PASSWORD (le mot de passe permettant d'accéder à votre email).

MAIL_DRIVER=smtp
MAIL_HOST=VotreHĂ©bergeurMail
MAIL_PORT=587
MAIL_USERNAME=info@test.ch
MAIL_PASSWORD=motDePasse
MAIL_ENCRYPTION=null

 

Si vous utilisez un webservice de messagerie, ses informations sont normalement disponibles dans les options. Par exemple pour Gmail, voici les informations qui nous sont indiquées.

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=test@gmail.com
MAIL_PASSWORD=motDePasseGmail
MAIL_ENCRYPTION=tls

 

Maintenant que notre fichier .env est configuré convenablement, passons à la partie la plus intéressante, le controler.

use Mail;

public function sendemail()
    {
            Mail::send('chemin/de/la/view', [], function($message)
            {
                $subject="sujet1";
                $message->from('info@test.ch');
                $message->to("destinataire@mail.com")->subject($subject);
            });
    }

 

Dans cet exemple, nous avons une fonction sendemail() qui envoie un mail à destinataire@mail.com depuis info@test.ch, l'email aura comme titre "sujet1" et le contenu de son message proviendra de la vue dont le chemin a été spécifié "chemin/de/la/view". Cette view est une vue standard, donc un fichier .blade.php au contenu statique, dans le chapitre suivant, nous allons voir comment y rajouter du contenu dynamique, car envoyer encore et toujours le même email ce n'est pas très pratique.

 

Créer/envoyer un mail au contenu dynamique

Voici le controler ayant la fonction sendemail() qui permet d'envoyer un mail avec du contenu pseudo-dynamique, car celui-ci est défini directement en dur dans le controler (dans la variable $content).

use Mail;

public function sendemail()
    {
        $title = "sujet1";
        $content = "je suis le contenu du mail";
        $user_email = "adresse_mail_du_destinataire";
        $user_name = "nom du destinataire";
        
        try
        {
            $data = ['email'=> $user_email,'name'=> $user_name,'subject' => $title, 'content' => $content];
            Mail::send('admin/user/email', $data, function($message) use($data)
            {
                $subject=$data['subject'];
                $message->from('info@test.ch');
                $message->to($data['email'], 'test.ch')->subject($subject);
            });
        }
        catch (\Exception $e)
        {
            dd($e->getMessage());
        }

    }

Analysons ce bout de code.

On utilise la façade Mail de Laravel

use Mail;

 

On définit les variables contenant le titre du mail, son contenu, le nom du destinataire ainsi que son email.

$title = "sujet1";
$content = "je suis le contenu du mail";
$user_email = "adresse_mail_du_destinataire";
$user_name = "nom du destinataire";

 

On ouvre un try/catch, qui permet en cas d'erreur de les afficher (afin de pouvoir résoudre le problème plus facilement).

 try
        {
            ...
        }
catch (\Exception $e)
        {
            dd($e->getMessage());
        }

 

Dans le try, on va créer une variable array() nommée $data, elle va servir à regrouper le contenu des différentes variables créées précédemment.

$data = ['email'=> $user_email,'name'=> $user_name,'subject' => $title, 'content' => $content];

 

A la suite de la création de $data, nous allons créer la fonction permettant d'envoyer le mail. On appelle la façade Mail, puis on appelle sa fonction send. Comme paramètres, on lui passe le chemin de notre view contenant la mise en page de l'email (dans cet exemple, la vue appelée se trouve à l'emplacement resources/views/admin/user/email.blade.php), puis on lui passe notre variable $data et finalement une function($message) en n'oubliant pas de spécifier avec un use que nous voulons utiliser le contenu de la variable $data dans la fonction.

Mail::send('admin/user/email', $data, function($message) use($data)
            {
               ...
            });

 

A l'intérieur des accolades du Mail::send, nous allons construire le courriel. Tout d'abord, nous allons lui spécifier un sujet, le titre du mail, en utilisant l'entrée subject de notre array() $data.

$subject=$data['subject'];

 

Puis, nous allons définir le from de $message. Dans les parenthèses, il vous suffit d'écrire votre adresse mail, celle qui va être utilisée pour envoyer le mail.

$message->from('info@test.ch');

 

Il ne vous reste plus qu'à définir le to en entrant l'email du destinataire (en utilisant l'entrée 'email' de $data) suivi de votre nom (ici test.ch) et de lier la variable $subject au message.

$message->to($data['email'], 'test.ch')->subject($subject);

 

Penchons-nous rapidement sur la view. Comme expliqué précédemment, celle-ci va contenir le message du mail à proprement dit. La vue est donc un fichier blade standard à Laravel. Si dans notre exemple nous voulons que l'email contienne simplement un "Bonjour" suivi du nom du destinataire, il suffit de créer le fichier défini dans le premier paramètre de Mail::send à savoir email.blade.php. Puis d'ajouter à ce fichier la ligne présentée ci-dessous. Le $name ne sort pas de nulle part, c'est une des entrées de $data, la variable que nous passons à la vue.

Bonjour {{$name}}

 

Maintenant, imaginons que nous avons un formulaire permettant d'y entrer un titre et un message, quelque chose qui ressemble à ça :

 

En appuyant sur le bouton "Envoyer", nous désirons créer et envoyer un mail contenant le titre et le contenu du message que nous avons entré via le formulaire. Pour réaliser une telle fonction, il nous suffirait de nous inspirer de la précédente en faisant en sorte que le contenu des variables $title et $content soient récupérés depuis le formulaire (via un POST par exemple), ce qui nous donnerait quelque chose comme ça :

 public function sendemail(Request $request)
    {
        $title = $request->title;
        $content = $request->content;
        ...
    }

 

Envoyer un mail à plusieurs destinataires

Envoyer un même email à plusieurs personnes n'est pas une tâche ardue avec Laravel. En s'inspirant de l'exemple précédent, voici le code de l'intérieur de la fonction sendemail().

$emails = ['test1@hotmail.com','test2@hotmail.com','test3@hotmail.com'];
$data = ['email'=> $user_email,'name'=> $user_name,'subject' => $title, 'content' => $content];

Mail::queue('admin/user/email', $data, function($message) use ($emails, $data) {
            $subject=$data['subject'];
            $message->from('info@test.ch', 'test.ch');
            $message->to($emails);
            $message->subject($subject);
 });

 

Analysons brièvement le code.

La variable $emails contient les adresses mails des destinataires (ici elles sont inscrites en dur, on peut bien évidemment imaginer qu'elles sont récupérées via la base de données, via un formulaire ou autre).

Pour le use, on n'utilise plus seulement $data mais aussi l'array contenant les mails, $emails. C'est à partir de celui-ci que nous allons définir le to. Pas besoin de boucler, en lui passant un tableau il va comprendre tout seul qu'il doit envoyer un mail pour chacune des entrées de l'array.

Une dernière chose, si vous ne voulez pas que les destinataires voient les adresses mails des autres destinataires, vous pouvez les cacher en remplaçant le to par un bcc.

$message->bcc($emails);

 

Conclusion

Laravel est un framework complet permettant d'envoyer des emails très simplement sans devoir installer de plugin supplémentaire. Si vous utilisez des services mails SMTP comme Mailgun, Mandrill ou Amazon SES, Laravel fournit des drivers permettant de les utiliser, pour plus d'information sur le sujet, je vous invite à consulter la documentation relative à chaque service mail de ce type.

Pour ce qui est de la mise en forme de l'email (la vue), je ne peux que vous conseiller d'utiliser le framework frontend Foundation. Car il permet d'afficher des mails en responsive et vu le nombre de personnes qui lisent leurs courriels via un device à petit écran, c'est une plus-value non négligeable.

 

Sources :