Symfony - Utiliser les services GMail

Par FlUxIuS 2008-07-02 { Catégorie : PHP }

(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.

 

Introduction

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 sur Symfony

Swift est avant tout une librairie indépendante de Symfony, donc si vous voulez l'intégrer hors frameworks : Lisez la documentation

Installation

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

 

Configuration

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
 
 

Utilisation

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.

 

Envoyer des mails HTML

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.

 

Envoyez plusieurs parties

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"

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).

 

Utilisation de Gmail

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.

 

Optimisation

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...)

 

Plus d'informations

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

- http://www.swiftmailer.org/

Powered by SlashOn blog - © Sebastien D. (FlUxIuS)

Debian powered Server Creative Commons License W3c Validation
Cette création est mise à disposition sous un contrat Creative Commons