ZF : Comment envoyer un mail avec une pièce jointe ?

Introduction

Que ce soit pour la confirmation d’inscription ou pour une newsletter, à un moment ou un autre, vous devrez envoyer un mail.

Mais cette tâche peut devenir compliquée, et encore plus s’il vous prend l’idée d’envoyer une ou plusieurs pièces jointes avec votre mail.

Heureusement, des bibliothèques existent et permettent d’éviter de concevoir notre propre code. Étant utilisateur de Zend Framework, je vais vous présenter comment envoyer des mails accompagnés de pièces jointes en utilisant ce dernier. Vous verrez alors la simplicité de la chose.

Le transporteur

Pour envoyer des mails, le module Zend Mail a besoin d’un transporteur. Par défaut, le transporteur Sendmail est utilisé, mais il en existe d’autre : SMTP ou encore File (dans le système de fichier).

Nous utiliserons donc le transporteur Sendmail. Le transporteur SMTP est pratique si vous devez passer par un SMTP autre que votre serveur. Je vais tout de même vous montrer un exemple d’utilisation avec le transporteur SMTP.

Par exemple, si vous hébergez votre serveur chez vous, il est fort probable qu’il soit nécessaire d’utiliser le SMTP de votre fournisseur d’accès. L’avantage est que vous évitez le blacklistage. De plus, chez certain fournisseur, le port 25 est bloqué en sortie, c’est le cas chez Orange. Dans l’exemple suivant, nous verrons l’utilisation du SMTP de Free.

La configuration est assez simpliste, il suffit de spécifier le nom d’utilisateur et le mot de passe de votre compte de messagerie.

$tr = new Zend_Mail_Transport_Smtp('smtp.free.fr', array(
    'username' => 'nom_utilisateur', 'password' => 'votre_mot_de_passe'
));
Zend_Mail::setDefaultTransport($tr); // on utilisera  ce transport par défaut

Ce bout de code se place généralement dans le bootstrap de votre application.

À tout moment, vous pouvez spécifier un transporteur différent au moment de l’envoi du mail.

$tr = new Zend_Mail_Transport_Smtp('smtp.free.fr', array(
 'username' => 'nom_utilisateur', 'password' => 'votre_mot_de_passe'
));
Zend_Mail::setDefaultTransport($tr); // on utilisera  ce transport par défaut

$mail = new Zend_Mail('utf-8');
$mail->setSubject('Test d'envoi de mail simple')
 ->addTo('destinataire@domaine.tld')
 ->setFrom('expediteur@domaine.tld', 'Blount') // expéditeur
 ->setBodyText('Contenu du corp du mail au format text.'); // message du mail

$mail->send(); // envoi avec transporteur par défaut

$tr = new Zend_Mail_Transport_Sendmail();
$mail->send($tr); // envoi avec Sendmail

$mail->send(); // envoi avec transporteur par défaut

Envoi du mail avec une pièce jointe

Attaquons les choses sérieuses. Maintenant que vous savez comment fonctionne l’envoi d’un mail simple avec Zend Framework, nous allons y ajouter une pièce jointe.

Pour l’exemple, nous allons envoyer une newsletter au format PDF au lieu du format HTML habituel. Vous pourriez même l’envoyer dans les deux formats.

Pour ajouter une pièce jointe, il suffit de créer une instance de « Zend_Mime_Part » et de l’ajouter au mail une fois configurée. Vous pouvez aussi utiliser la méthode « createAttachment » de « Zend_Mail ». La pièce jointe sera automatiquement ajoutée au mail de cette manière.

Voici la création de la pièce jointe :

$pdf = new Zend_Mime_Part(file_get_contents(dirname(__FILE__).'/newsletter.pdf'));
$pdf->type = 'application/pdf';
$pdf->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$pdf->encoding = Zend_Mime::ENCODING_BASE64;
$pdf->filename = 'newsletter.pdf';

Lors de sa construction, « Zend_Mime_Part » prend soit une chaîne binaire soit un flux de données (avec fopen par exemple). Dans mon exemple, je récupère une chaîne en utilisant file_get_contents d’un fichier dans le même répertoire que mon fichier PHP de test.

Les lignes suivantes permettent de configurer la pièce jointe. Nous définissons le type de la pièce jointe, ici nous envoyons un PDF.

La « disposition » va indiquer comment vont être traité les données. En effet, « Zend_Mime_Part » permet d’ajouter un « message » dans le mail. Pour indiqué que nous souhaitons envoyer une pièce jointe, nous spécifions « Zend_Mime::DISPOSITION_ATTACHMENT ». Il existe aussi « Zend_Mime::DISPOSITION_INLINE », permettant, par exemple, d’ajouter une image qui sera utilisée dans le mail au format HTML.

L’attribut « encoding » spécifie comment les données seront encodées.

Enfin, l’attribut « filename » permet de configurer le nom donné à la pièce jointe.

Maintenant que nous avons configuré la pièce jointe, il suffit de l’ajouter à l’instance de mail avec la méthode « addAttachment » :

$mail = new Zend_Mail('utf-8');
$mail->setSubject('Test d'envoi de mail simple')
	->addTo('destinataire@domaine.tld')
	->setFrom('expediteur@domaine.tld', 'Blount') // expéditeur
	->setBodyText('Contenu du corp du mail au format text.'); // message du mail

$pdf = new Zend_Mime_Part(file_get_contents(dirname(__FILE__).'/newsletter.pdf'));
$pdf->type = 'application/pdf';
$pdf->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$pdf->encoding = Zend_Mime::ENCODING_BASE64;
$pdf->filename = 'newsletter.pdf';
$mail->addAttachment($pdf);

$mail->send();

Et voila, vous avez envoyé votre pièce jointe avec succès. Vous pouvez bien entendu envoyer plusieurs pièces jointes.

Conclusion

Je vous avais indiqué en introduction que l’envoi de pièce jointe était simpliste avec Zend Framework. Je pense que je ne vous ai pas menti.

1 réflexion sur « ZF : Comment envoyer un mail avec une pièce jointe ? »

Répondre à billards.sl@orange.fr Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.