Laravel : Envoyer un mail via le serveur SMTP Google

Mis à jour il y a 2 mois

Wilo Ahadi

Auteur

Wilo Ahadi

Technologies

Un guide pour envoyer un courrier électronique ou e-mail dans un projet Laravel en utilisant un compte Gmail et le serveur SMTP Google.

Introduction

Le framework PHP Laravel fournit une API d’envoi de courrier électronique (courriel, mail ou e-mail) basée sur la librairie SwiftMailer.

Cet API Laravel d’envoi de courriel permet d’utiliser les services locaux ou cloud à travers des drivers (pilotes) pour :

  • SMTP
  • sendmail
  • Amazon SES
  • Mailgun
  • Postmark

Le SMTP, « Simple Mail Transfer Protocol », est un protocole de communication utilisé pour transférer un courriel vers les serveurs de messagerie électronique.

Dans ce guide, nous allons voir comment utiliser le serveur SMTP de Google pour envoyer un e-mail depuis une application Laravel en utilisant un compte Gmail (@gmail.com). Mais avant, nous allons voir comment créer le mot de passe d’application Google que nous allons utiliser pour ce compte.

Créer un mot de passe d’application Google

Un mot de passe d'application Google est un code secret à 16 chiffres qu’un appareil ou une application n'appartenant pas à Google, tels que l’application Laravel que nous allons créer, peut utiliser pour accéder aux informations et services d’un compte Google.

Nous allons utiliser ce mot de passe pour la configuration du driver SMTP dans le projet Laravel. 

Voici la procédure pour obtenir un mot de passe d’application Google :

  1. Accédez au gestionnaire de votre compte Google au lien suivant : https://myaccount.google.com
  2. Au panneau de navigation à gauche, cliquez sur Sécurité
  3. Aux paramètres de sécurité, dans la zone Connexion à Google, cliquez sur Mots de passe des applications. Si cette option n’apparait pas, assurez-vous d’avoir activé la Validation en deux étapes aux paramètres de sécurité.
  4. Au bas de la page Mots de passe des applications, cliquez sur Sélectionnez une application, allez sur Autre (Nom personnalisé) pour entrer le nom de votre application
  5. Cliquez sur Générer pour obtenir le mot de d’application à 16 chiffres

La capture ci-dessous illustre cette procédure :

Création d'un mot de passe d'application Google

Nous vous recommandons de consulter l’aide compte Google si vous rencontrez des problèmes.

Envoyer un e-mail via SMTP dans un projet Laravel

Nous allons ici décortiquer en trois étapes la procédure d’envoi d’un email dans un projet Laravel en utilisant le serveur SMTP de Google :

1. La configuration SMTP

Editons les informations MAIL_* au fichier .env à la racine du projet en renseignant les informations SMTP de la manière suivante :

…
MAIL_DRIVER=smtp
MAIL_HOST=smtp.googlemail.com
MAIL_PORT=465
MAIL_USERNAME=votre_adresse@gmail.com
MAIL_PASSWORD=votre_mot_de_passe_d_application
MAIL_ENCRYPTION=ssl
…

Nous avons :

  • MAIL_DRIVER : le canal transfert du mail (MAIL_MAILER pour la version 7 de Laravel)
  • MAIL_HOST :  l’adresse du serveur SMTP
  • MAIL_PORT : Le port utilisé par serveur SMTP Google
  • MAIL_USERNAME : votre adresse email GMAIL
  • MAIL_PASSWORD : le mot de passe d’application à 16 chiffres que nous avons généré
  • MAIL_ENCRYPTION : Le cryptage

 

2. La classe Mailable

Chaque email dans un projet Laravel est représenté par une classe Mailable. Celle-ci fournit des méthodes pour configurer la présentation et l’envoie du mail.

Pour générer la classe Mailable pour notre message, appelons-la « MessageGoogle », la commande artisan à exécuter dans la console est la suivante :

php artisan make:mail MessageGoogle

Cette commande crée le fichier MessageGoogle.php dans le répertoire App\Mail. Nous allons y ajouter les informations suivantes :

  • Une propriété publique $data pour passer les données à la vue (présentation de l’e-mail). Les données pour $data seront transmises par le constructeur
  • L’expéditeur from(…), le sujet du message subject(…), la vue à présenter view(…) dans la méthode build()

Le code de la classe Mailable MessageGoogle.php

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class MessageGoogle extends Mailable
{
    use Queueable, SerializesModels;

    public $data; // Données pour la vue

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function build()
    {
        return $this->from("wilo.ahadi@gmail.com") // L'expéditeur
                    ->subject("Message via le SMTP Google") // Le sujet
                    ->view('emails.message-google'); // La vue
    }
}

La vue ressources/views/emails/message-google.blade.php se présente de la manière suivante :

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body style="background: #e5e5e5; padding: 30px;" >

<div style="max-width: 320px; margin: 0 auto; padding: 20px; background: #fff;">
	<h3>Message via le SMTP Google :</h3>
	<div>{{ $data['message'] }}</div>
</div>

</body>
</html>

 

3. L’envoie du mail

Nous allons définir deux routes « message » et un contrôleur « MessageController » :

  • La route « /message » (GET) pour présenter le formulaire où entrer le message à envoyer
  • La route « /message » (POST) pour le traitement lorsque le formulaire est soumis, l’envoi du message
  • Le contrôleur « MessageController » pour gérer les actions de ces routes.

Pour générer le contrôleur, exécutons la commande artisan suivante :

php artisan make:controller MessageController

Cette commande crée le fichier App\Http\Controllers\MessageController.php, nous allons l’éditer après avoir défini les routes.

Définissons les routes au fichier routes/web.php en ajoutant ces lignes :

Route::get("message", "MessageController@formMessageGoogle");
Route::post("message", "MessageController@sendMessageGoogle")->name('send.message.google');

Les actions des routes au contrôleur « MessageController » :

  • « formMessageGoogle » pour afficher la vue ressources/views/forms/message-google.blade.php qui présente le formulaire
  • « sendMessageGoogle » pour valider le message puis envoyer l’email aux utilisateurs

Le formulaire de la vue message-google.blade.php avec un champ « message » où écrire le message à envoyer peut se présenter de la manière suivante :

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>Le formulaire d'envoi du message</title>
</head>
<body>

	@if (session()->has('text'))
	<p>{{ session('text') }}</p>
	@endif

	<form url="{{ route('send.message.google') }}" method="POST" >
		<label for="message" >Message</label>
		{{ @csrf_field() }}
		<p>
			<textarea name="message" id="message" rows="4" placeholder="Message à envoyer ici" ></textarea>
			{{ $errors->first('message', ":message")}}
		</p>
		<button type="submit" >Envoyer</button>
	</form>

</body>
</html>

Revenons au contrôleur MessageController.php :

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

//Importation des classes pour le mail
use App\User;
use Illuminate\Support\Facades\Mail;
use App\Mail\MessageGoogle;

class MessageController extends Controller
{
	// Le formulaire du message
	public function formMessageGoogle () {
		return view("forms.message-google");
	}

    // Envoi du mail aux utilisateurs
	public function sendMessageGoogle (Request $request) {

		#1. Validation de la requête
		$this->validate($request, [ 'message' => 'bail|required' ]);

		#2. Récupération des utilisateurs
		$users = User::all();

		#3. Envoi du mail
		Mail::to($users)->bcc("wilo.ahadi@gmail.com")
						->queue(new MessageGoogle($request->all()));

		return back()->withText("Message envoyé");
	}

}

 

Résumons tout. Pour envoyer un email dans un projet Laravel en utilisant le serveur SMTP Google, nous avons :

  1. Créé le mot de passe d’application Google pour le compte @gmail
  2. Renseigné les informations de configuration SMTP au fichier .env du projet Laravel
  3. Créé la classe Mailable pour configurer l’email à envoyer
  4. Créé la route « message » (GET) pour présenter le formulaire où entrer le message à envoyer
  5. Créé la route « message » (POST) pour envoyer le message

 

Wilo Ahadi
Wilo Ahadi, l'auteur

Passionné de l'informatique, je suis spécialiste en techniques des systèmes et réseaux, développeur web et mobile, Infographiste et designer, ... J'aime partager mon expérience en formant sur Akili School

Voir mon profil Suivre