Swiftmailer, une librairie pour envoyer des mails

Introduction
Nous avons déjà vu dans une précédente ressource comment envoyer des pièces-jointes par mail. Cette technique est assez simple à mettre en place mais il faut le reconnaitre, il y a mieux.Ce mieux c'est Swiftmailer, une libraire PHP qui permet de d'envoyer des mails très facilement.
Swiftmailer est utilisé par le framework PHP Symfony, preuve de sa qualité.
Les commandes de base
Il faut commencer par inclure cette librairie dans notre script PHP. Vous le récupérez facilement sur le site officiel de Swiftmailer.Ensuite il faut créer une instance de Swiftmailer qui aura comme paramètre un mode de transport.
Dans notre cas nous utiliserons le SMTP (vous pouvez utiliser la fonction mail classique ou une sendmail).
Pour passer par le SMTP vous aurez besoin du smtp, du port et des identifiants d'un compte email.
Ensuite on créé l'instance de message.
<?php // Librairie require_once 'lib/swift_required.php'; // SMTP $smtp_param = Swift_SmtpTransport::newInstance('smtp.nomdedomaine.fr', 587) ->setUsername('mail@nomdedomaine.fr') ->setPassword('motdepasse_adress_email'); // Instance Swiftmailer $instance_swiftmailer = Swift_Mailer::newInstance($smtp_param); // Instance message $message = Swift_Message::newInstance(); ?>
Passons ensuite aux méthodes permettant de paramétrer un mail :
- setSubject(), contient le sujet du mail
- setBody(), contient le message
- setFrom(), setTo(), setCc définissent les adresses mail.
- setPriority(), pour donner une importance au message
Toutes les adresses email (envoi et réception) sont à écrire :
- dans un tableau avec comme clé l'adresse mail et comme valeur le nom.
- dans un tableau, sans clé mais avec comme contenu l'adresse mail
- sous forme de chaine de caractère mais dans ce cas avec une seule adresse.
- setSubject(), contient le sujet du mail
- setBody(), contient le message
- setFrom(), setTo(), setCc définissent les adresses mail.
- setPriority(), pour donner une importance au message
Toutes les adresses email (envoi et réception) sont à écrire :
- dans un tableau avec comme clé l'adresse mail et comme valeur le nom.
- dans un tableau, sans clé mais avec comme contenu l'adresse mail
- sous forme de chaine de caractère mais dans ce cas avec une seule adresse.
$message->setSubject( utf8_encode('Ceci est le sujet SWIFTMAILER')) ->setFrom(array('from@nomdedemaine.fr' => 'Adresse FROM')) ->setTo(array('to@nomdedemaine.fr' => 'Adresse TO')) ->setBody( '<html> <head></head> <body> <h1>Test de la librairie SWIFTMAILER</h1> Lorem ipsum <em>bla bla bla</em> </body>' , 'text/html') ->setPriority(2);
Si vous souhaitez inclure des documents en pièces-jointes il vous faudra passer par la méthode attach() qui contiendra la class Swift_Attachment.
Vous pourrez inclure l'url du fichier à envoyer et, si vous le souhaitez, changer le nom du document.
Ce qui donnera :
Vous pourrez inclure l'url du fichier à envoyer et, si vous le souhaitez, changer le nom du document.
Ce qui donnera :
$message->attach(Swift_Attachment::fromPath('file123456789.txt')->setFilename('rapport.txt'))
Pour inclure une image dans votre document il faudra utiliser la méthode embed() qui contiendra une instance de Swift_image :
$message->setBody('Message avec le texte <img src="' . $message->embed(Swift_Image::fromPath('logo.png')) . '" alt="Logo" />');
Si le client de mail ne lit pas le html ou le bloque vous pouvez écrire un message de substitution avec addPart()
$message->addPart('Ceci est une alternative textuelle au mail, si le client ne lit pas le HTML', 'text/plain');
Il nous reste plus qu'à configurer les dernières informations concernant le header du mail et à l'envoyer :
$type = $message->getHeaders()->get('Content-Type'); $type->setValue('text/html'); $type->setParameter('charset', 'iso-8859-1'); if ($instance_swiftmailer->send($message, $fail)) { echo 'Envoyé '; }else{ echo 'ERREUR : '; print_r($fail); }
Les plugins pour aller plus loin
Une des forces de Swiftmailer est que l'on peut utiliser facilement des plugins.Vous trouverez des plugins :
- Dit "antiflood" pour ne pas spammer ou envoyer une quantité trop importante de mail d'un coup.
- De personnalisation de mail où vous n'aurez plus qu'à écrire dans votre mail des variables qui seront remplacées par les données propres au client (nom / prénom / mot de passe par exemple).