Laravel : Envoyer un mail via le serveur SMTP Google

Mis à jour il y a 3 ans

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

Wilo Ahadi

Auteur

Wilo A.

Technologies

Laravel, PHP
Voir aussi Un tutoriel pour afficher la date d'un modèle dans un input HTML de type datetime-local dans un projet Laravel 10. En savoir plus

Introduction

Le framework PHP Laravel fournit une API d’envoi de courrier électronique (courriel, mail ou e-mail) qui 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.

Nous voulons voir dans ce guide 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, commençons par voir comment créer le mot de passe d’application Google que nous allons utiliser pour le compte @gmail.

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 notre application Laravel, peut utiliser pour accéder aux informations et services d’un compte Google.

Nous allons utiliser ce mot de passe d'application 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 à travers 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’apparaît 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 la 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 mail via SMTP dans un projet Laravel

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

1. Configurer le SMTP

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

…
MAIL_DRIVER=smtp
MAIL_HOST=smtp.googlemail.com
MAIL_PORT=465
[email protected]
MAIL_PASSWORD=votre_mot_de_passe_d_application
MAIL_ENCRYPTION=ssl
…

Nous avons :

  • MAIL_DRIVER : le canal de transfert du mail (MAIL_MAILER pour les versions >= 7 de Laravel)
  • MAIL_HOST :  l’adresse du serveur SMTP
  • MAIL_PORT : Le port utilisé par le 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. Créer la classe Mailable

Chaque mail 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 (invite des commandes) est la suivante :

php artisan make:mail MessageGoogle

Cette commande crée le fichier app/Mail/MessageGoogle.php. Nous allons l'éditer en ajoutant les informations suivantes :

  • Une propriété publique $data pour passer les données à la vue (présentation de l’e-mail)
  • 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 app/Mail/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("[email protected]") // L'expéditeur
                    ->subject("Message via le SMTP Google") // Le sujet
                    ->view('emails.message-google'); // La vue
    }
}

La vue resources/views/emails/message-google.blade.php peut se présenter 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. Envoyer le mail

Pour envoyer le courriel, nous allons définir deux routes « message » et un contrôleur « MessageController » :

  • La route « /message » (GET) pour présenter le formulaire HTML où saisir 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 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 « message » au fichier routes/web.php :

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

Nous avons les actions suivantes que nous allons décrire au contrôleur MessageController.php. :

  • « formMessageGoogle » pour afficher la vue resources/views/forms/message-google.blade.php où présenter le formulaire
  • « sendMessageGoogle » pour valider le message saisi puis envoyer le mail aux utilisateurs

Le formulaire sur la vue message-google.blade.php avec un champ « message » où saisir 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 app/Http/Controllers/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("[email protected]")
						->queue(new MessageGoogle($request->all()));

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

}

Résumons tout. Pour envoyer un mail 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 le mail à envoyer
  4. Créé la route « message » (GET) pour présenter le formulaire où saisir le message à envoyer
  5. Créé la route « message » (POST) pour envoyer le message

Portez-vous bien ! 😉

Cette publication vous a plu ?
Partagez-la avec vos ami(e)s sur les réseaux sociaux.

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 la plateforme Akili School

Voir profil

Commentaires