La classe Zend_Mail de Zend Framework permet d’envoyer des emails avec toutes les fonctionnalités utiles habituelles : ajout de destinataires en copie ou en copie cachée, ajout de pièces jointes, envoie de headers supplémentaires, ajout d’un relai SMTP etc.
Si dans un projet vous avez régulièrement besoin d’utiliser cette classe, certains aspects peuvent être rébarbatifs, pour les pièces jointes notamment.
QuickMail
En tout cas c’est l’impression que j’ai eu, c’est pourquoi j’ai créé une classe qui étend la classe Zend_Mail et qui permet d’envoyer en quelques lignes de code des emails complets.
La classe est disponible sur GitHub : QuickMail.
Voici un aperçu d’un envoie d’email avec Cc, Bcc, pièce jointe, image et header supplémentaire :
$content = '<p>Bonjour, voici ma photo : <img src="cid:maphoto.jpg" alt="Ma photo" /></p>';
$subject = 'Mon sujet';
$recipients = array(
'friend@domain.com'
);
$from = 'mymail@domain.com';
$fromName = 'Louis';
$recipientsCc = array(
'copy.friend@domain.com',
'anothercopy.friend@domain.com'
);
$recipientsBcc = array(
'hidden.friend@domain.com'
);
$attachments = array(
'/tmp/maphoto.jpg',
'/tmp/random-pdf.pdf'
);
$headers = array(
'X-Mailer' => 'QuickMail'
);
if (QuickMail::isValid($recipients)) {
$mail = new QuickMail();
$mail->feed(
$content,
$subject,
$recipients,
$from,
$fromName,
$recipientsCc,
$recipientsBcc,
$attachments,
$headers
);
$mail->send();
} else {
echo 'Un email est invalide';
}
Tester la validité des emails
La fonction QuickMail::isValid
est statique et permet donc de tester la validité d’un email n’importe où dans votre code sans instancier d’objet. Vous pouvez lui passer un email ou un tableau d’emails.
Elle teste dans un premier temps si le format de l’email est valide, et dans un deuxième temps la validité du domaine.
Les images dans le corps de l’email
Pour afficher une image dans un email vous avez plusieurs solutions.
Vous pouvez indiquer un lien HTTP de l’emplacement de l’image sur votre serveur : <img src="http://www.monserveur.com/maphoto.jpg" alt="Ma photo" />
Vous pouvez également encoder l’image en base64 : <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgA...AAAABJRU5ErkJggg==" alt="Ma photo" />
Ou bien vous pouvez joindre l’image à l’email et lui renseigner un CID comme ceci : <img src="cid:maphoto.jpg" alt="Ma photo" />
La première solution est la plus simple mais nécessite de mettre à disposition les images sur un serveur. La deuxième solution est très pratique mais n’ai pas supportée par tous les clients de messagerie. La dernière solution permet de s’affranchir du serveur.
Dans tous les cas l’affichage des images sera potentiellement bloqué par défaut. L’encodage en base64 est à proscrire si vous comptez être lu par tous les clients, après à vous de choisir entre les deux autres solutions en fonction de vos besoins.
En ce qui concerne la classe QuickMail, vous pouvez soit insérer un lien HTTP vers une image directement, soit passer l’image en pièce jointe et indiquer dans l’attribut src de l’image cid:maphoto.jpg
Si vous travaillez avec Zend Framework et que cette classe vous intéresse, n’hésitez pas à la télécharger et à me faire part de vos remarques !