PHPMailer sur Windows

17 12 2011

Ah l’envoi de mail() en PHP, une fonctionnalité qui a toujours été un peu foireuse sur les bords.

Petit billet donc pour faire le tour des différentes solutions pour envoyer des emails et les problèmes couramment rencontrés.

PHP est fournis avec une fonction unique permettant d’envoyer des mails : mail().
Son fonctionnement est assez bas niveau, elle est simple à utiliser pour envoyer des emails de base, en texte brut avec un seul destinataire.

Mais quand on veut faire des choses plus complexes (plusieurs destinataires, copies cachées, pièces jointes, multipart texte brute/html, encodage UTF-8…) ça se corse, puisque c’est au développeur de jongler avec les headers, du style :

$headers =	"From: ".$from."\n";
$headers .=	"MIME-version: 1.0\n";
$headers .=	"content-type: text/html; charset=utf-8\n";

Autant dire que c’est vite chiant.
C’est pour ça que des gens intelligents et courageux ont travaillé sur des surcouches permettant construire et envoyer des emails avec une approche objet.

Le plus célèbre est PHPMailer, mais il en existe d’autres comme Swiftmailer, XPertMailer ou encore le vieux SimpleMail qui n’est plus disponible en ligne, ainsi qu’une multitude de petites classes qu’on peut trouver à droite à gauche sur des sites de partage de code.

Sur le papier ça a l’air bien, mais pourtant on peut rencontrer beaucoup de problèmes, avec PHPMailer notamment, quand on utilise la méthode IsMail().

En fait, PHPMailer propose plusieurs méthodes d’envoi pour les emails :

  • IsMail() : utilise la fonction mail classique
  • IsSMTP() : se connecte à un serveur SMTP, comme Thunderbird par exemple
  • IsSendmail() : utilise le programme sendmail

Et c’est justement à ce niveau que les problèmes surviennent. IsMail présente l’intérêt de ne pas avoir à configurer la connexion au serveur SMTP (aucun host, port, identifiants… à remplir), puisqu’il utilise la fonction mail native.

Le seul hic c’est que cette fonction mail() a un comportement très exotique :

  • Sur un système Unix (Linux ou Mac), la présence du programme sendmail est nécessaire pour fonctionner, comme indiqué dans la doc. PHP connait l’emplacement de sendmail sur le disque grâce à la directive sendmail_path dans php.ini.
  • Sur windows par contre, il y a un comportement spécifique pour cette fonction, on doit fournir l’adresse et le port du serveur SMTP à utiliser pour l’envoi de mail, ce sont les directives SMTP & smtp_port :
    SMTP = smtp.orange.fr
    smtp_port = 25

Cette différence fait apparaître de nombreux problèmes, notamment au niveau des retours chariot (EOL pour End Of Line) qui sont différents sur Windows (\r\n) et sur UNIX (\n). En effet, le format d’EOL est très important dans les headers d’un mail, s’ils ne sont pas conformes aux spécifications, certains clients mail les interprètent mal et n’arrivent pas à décoder le mail. C’est comme ça qu’on se retrouve avec des emails vides sur Thunderbird (sans rien dans le corps du message), alors que quand on regarde la source de l’email (Ctrl + U), on voit bien tout le message.

Vous pouvez lire ce ticket : Bug #15841 qui parle de ces différences entre les environnements.


Partager :

Ces icônes sont des liens vers des sites de partage de signet sociaux où les lecteurs peuvent partager et découvrir de nouveaux liens.
  • Digg
  • del.icio.us
  • Facebook
  • Digg -fr
  • Live
  • MisterWong Fr
  • Scoopeo
  • StumbleUpon
  • Technorati
  • Wikio FR

Actions

Informations

Et maintenant je fais quoi ?

Laisser un commentaire

Vous pouvez utiliser ces balises html : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>