Envoyer des emails avec Swift Mailer

J’ai longtemps utilisé PHPMailer pour l’envoi de mails en PHP, pour sa simplicité d’utilisation et sa fiabilité, sans trop m’intéresser à la concurrence. En me mettant à Symfony j’ai vu qu’ils utilisaient la librairie Swift Mailer et c’est vrai qu’elle est vraiment pas mal du tout : rapide et fiable, un système de plugins excellent (Throttler, AntiFlood…), une documentation assez complète.

Bref, bien que je ne maîtrise pas encore parfaitement cette librairie (notamment tout ce qui est gestion d’erreurs), je me suis dit que ça pourrait être sympa d’avoir un petit exemple concret d’utilisation : l’envoi d’un nouveau mot de passe à un membre.

require_once 'lib/swift_required.php';

Class MyUser
{

    const WEBSITE_HOME = 'http://www.monsite.com';
   
    private function randomPass($length)
    {
        return substr(md5(uniqid(mt_rand(), true)), 0, $length);
    }

    public function sendNewPassword($dest, $user)
    {
        //Création d'une instance de swift transport (SMTP)
        $transport = Swift_SmtpTransport::newInstance()
          ->setHost('smtp.example.org')
          ->setPort(25);

        //Création d'une instance de swift mailer
        $mailer = Swift_Mailer::newInstance($transport);
       
        //Genère un mot de passe aléatoire
        $pass = $this->randomPass(10);
       
        //Récupère le template et remplace les variables
        $body = file_get_contents('template.html');
        $body = preg_replace("~{site}~i", self::WEBSITE_HOME, $body);
        $body = preg_replace("~{user}~i", $user, $body);
        $body = preg_replace("~{pass}~i", $pass, $body);

        //Création du mail
        $message = Swift_Message::newInstance()
          ->setSubject('Votre nouveau mot de passe')
          ->setFrom('noreply@monsite.com', 'Monsite')
          ->setTo($dest, $user)
          ->setBody($body, 'text/html', 'utf-8')
          ->addPart("Bonjour {$user}, voici votre nouveau mot de passe: {$pass}", 'text/plain');
       
        //Envoi du message et affichage des erreurs éventuelles
        if (!$mailer->send($message, $failures))
        {
            echo "Failures:";
            print_r($failures);
        }
    }  
}

J’ai récupéré ma petite fonction pour générer un mot de passe aléatoire. J’utilise aussi un template HTML dont voici le code :

<!-- fichier template.html -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <base href="{site}" />
    <title>Recover password</title>
</head>
    <body>
        <p>
            Bonjour <b>{user}</b>, voici votre nouveau mot de passe: <i>{pass}</i><br />
            Vous pouvez dès maintenant vous connecter sur <a href="{site}">mon site</a> avec vos identifiants
        </p>
        <p>
            A bientôt !
        </p>
    </body>
</html>

Libre à vous de modifier le template en ajoutant du css ou des images. A noter qu’on peut aussi utiliser le plugin Decorator pour remplacer les variables user et pass, mais bon la fonction preg_replace de PHP marche aussi très bien. Et voilà comment utiliser la classe :

$user = new MyUser();
$user->sendNewPassword('toto@gmail.com', 'toto');

Il faudra ensuite créer vos propres fonctions pour récupérer les informations du membre grâce à son adresse email (via un formulaire) et mettre à jour le mot de passe du membre dans la base de données.

4 Commentaires sur “Envoyer des emails avec Swift Mailer”

  • tidus05
    # Le 13 mars 2014 à 14 h 14 min

    Bonjour,

    Comment faites vous si le HTML n’est pas pri en compte du côté du client ?

    Cordialement,

    Flo

    1
  • mika
    # Le 13 mars 2014 à 19 h 19 min

    Dans ce cas c’est le text/plain qui va être utilisé, il est déclaré ici :
    ->addPart(« Bonjour {$user}, voici votre nouveau mot de passe: {$pass} », ‘text/plain’);

    Pour un mail plus long, il serait préférable de créer un fichier .txt et de charger son contenu avec un file_get_contents

    2
  • Maxime
    # Le 4 avril 2014 à 10 h 18 min

    Bonjour,
    A quoi correspond :
    « ~{site}~i »
    « ~{user}~i »
    « ~{pass}~i »

    ?

    Merci !
    Cordialement,
    Maxime.

    3
  • mika
    # Le 4 avril 2014 à 12 h 18 min

    Bonjour,

    Ce sont les pseudos variables qui sont remplacées dans le template html grâce à la fonction preg_replace.

    4

Laisser un commentaire

Vous pouvez ces balises HTML dans votre commentaire :
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Current month ye@r day *