(Contribution postée sur Symfony)
Vous en avez marre d'installer spécialement un serveur mail et le maintenir pour vos services ? Une seule chose à faire : Installer Swift Mail !
Profitez ainsi du service GMail.
Swift mail est une librairie Orientée Objet permettant le relai des mails et donc ne plus utiliser le pauvre Postfix, le maintenir, mais surtout de le configurer pour être authentifié par les autres services et ne pas voir vos mails jetés dans la corbeille de spams.
Nous verrons ici comment installer le plugin et l'utiliser de différentes façons. Et au final, ce que vous attendez tous : L'utilisation des services Gmail.
/!\ Ceci à été testé sur la 1.0 et 1.1
Swift est avant tout une librairie indépendante de Symfony, donc si vous voulez l'intégrer hors frameworks : Lisez la documentation
Pour cela, pas besoin de ce creuser les méninges, tapez cette commande pour l'installer en tant que plugins Symfony :
php symfony plugin-install http://plugins.symfony-project.com/sfSwiftPlugin
Copiez autoload.yml.sample de plugins/sfSwiftPlugin/config/ dans config/ pour charger le service à tout moment. (C'est l'autoload en POO).
cp plugins/sfSwiftPlugin/config/autoload.yml.sample config/autoload.yml
Voilà un exemple de configuration :
autoload: swift_mailer_classes: name: SWIFT Mailer classes path: %SF_PLUGINS_DIR%/sfSwiftPlugin/lib/swift/lib recursive: on
Symfony est très flexible dans l'utilisation des fichiers de configuration et c'est pour ça que nous allons aller jusqu'aux bout dans cette articles, en montrant comment utiliser cette librairie (Aussi facile que d'utiliser la fonction mail() ) et optimiser son utilisation grâce aux fichiers config.
Pour se faire, nous allons utiliser un objet permettant de générer des MIME Types, afin de d'étendre le format de l'email et d'envoyer autre chose que du texte.
Plutôt que de faire des exceptions à la ECH0 ou PRINT nous utiliserons spécialement pour de l'objet, le TRY & Catch. Et contrairement à ce qu'à écrit l'équipe Symfony dans son Cookbook, nous utiliserons son Exception qui est Swift_Exception :
try { // Crée l'objet de Mail et de Message $mailer = new Swift(new Swift_Connection_NativeMail()); $message = new Swift_Message('Mail\'s subject', $mailBody, 'text/html'); // Send $mailer->send($message, $mailTo, $mailFrom); $mailer->disconnect(); } catch (Swift_Exception $e) { $mailer->disconnect(); // handle errors here }
L'objet Swift est principalement l'objet qui réunit les méthodes de traitement des mails alors que Swift_Message lui est là pour générer une entête pour notre mail avec le corps de celui-ci, qui sera formaté comme nous le souhaitons. Il est clair que pour un message basique, vous n'aurez pas besoin du paramètre : "text/html" qui spécifie le type du message.
Si tout se passe bien, l'email est envoyé, sinon on montre les erreurs que nous souhaitons via le catch.
Dans mon cas, je ne m'en suis jamais servi, mais pour de l'emailing (pubs que vous recevez souvent dans vos boîtes), cela peut être pratique pour l'envoi de mail HTML + Text.
try { // Create the mailer and message objects $mailer = new Swift(new Swift_Connection_NativeMail()); $message = new Swift_Message('Sujet du mail'); // Render message parts $mailContext = array('name' => 'Sebastien Dudek'); $message->attach(new Swift_Message_Part($this->getPartial('mail/mailHtmlBody', $mailContext), 'text/html')); $message->attach(new Swift_Message_Part($this->getPartial('mail/mailTextBody', $mailContext), 'text/plain')); // Send $mailer->send($message, $mailTo, $mailFrom); $mailer->disconnect(); } catch (Swift_Exception $e) { $mailer->disconnect(); // handle errors there }
Attacher des choses et même pleins de choses via Swift_Message_Attachment :
... $mailer->attach(new Swift_Message_Attachment(file_get_contents("monebook.pdf"), "monebook.pdf", "application/pdf")); ...
Le premier paramètre pour l'initialisation est le contenu du PDF (par exemple), puis ensuite son nom et en dernier son type (logique mais c'est bien de rappeler).
Est c'est là que la magie des WebServices de PHP opère et où tout les avantages du l'utilisation de cette librairie se regroupent. Je vous avait montré ci-dessus un code new Swift_Connection_NativeMail(), bien maintenant pour l'utilisation d'un service tel que google nous le remplacerons par des paramètres de connection propres à GMail.
$connection = new Swift_Connection_SMTP('smtp.gmail.com', 465, Swift_Connection_SMTP::ENC_SSL); $connection->setUsername('sebastien.beta@gmail.com'); $connection->setPassword('m0np4sSw0rd'); // mouhahahaa $mailer = new Swift($connection);
Avant d'appeler le mailer nous configurons les accès au service pour pouvoir l'exploiter.
Pour ceux qui ne connaissent pas encore toutes les fonctionnalités de Symfony, je rappel qu'il est possible d'optimiser le service afin de rendre l'utilisation du Mailer plus flexible.
Je vous donne alors le petit astuce :
1 - Ajoutez un fichier "app.yml" (par exemple) dans le répertoire config/ de votre projet Symfony. 2 - Rajoutez y quelques paramètres :
mail: sender_name: Slashon Mail sender_address: "no-reply@slashon.com" subject_prefix: "[Slashon]" mailer: smtp protocol: tls hostname: smtp.gmail.com port: 465 charset: utf-8 content_type: text/plain username: sebastien.beta@gmail.com password: sup4m02p4sS
Configuré ainsi, vous êtes sûr que ça marchera.
3 - Prise des informations stockées :
Un méthode de l'objet sfConfig appelé get() permet de récupérer les informations du fichiers YAML "app.yml" :
sfConfig::get('app_mail_subject_prefix'); // Retournera : [Slashon]
On prend les informations du fichier "app.yml" via app puis nous séléctionnons le champ subject_prefix de mail (tout ça séparé par des "_").
C'est un peu la même chose que Zend_Config (dans le principe) pour ceux qui ont déjà touché au ZendFrameWork :) (Sensiolab ne va pas aimer ça...)
BY Sebastien Dudek (at) Slashon.com
Bon j'espère que jusqu'ici, il n'y a pas de questions. Si il y'en avait vous pouvez me joindre sur le forum Slashon et si vous souhaitez contribuer : optimisé ce poste.
Sources :
- Inspiré de Symfonians : (fichier config/app.yml) Symfonians.org
Cette création est mise à disposition sous un contrat Creative Commons