Skip to content

Les mails

L’envoi d’un email repose sur un protocole : SMTP (Simple Mail Trasnfer Protocol). Il est envoyé par des clients de messagerie : MUA (Mail User Agent).

Le MUA va vérifier si le nom de la personne existe dans ce domaine au MTA (Mail Transfer Agent). Le client qui recoit le mail passe par POP (Post Office Protocol) /IMAP ( Protocol) pour recevoir le mail stocké sur le MTA

Identifier les serveurs SMTP

Obtenir la liste des SMTP pour un serveur :

Liste serveurs SMTP

Utilisation des mails en PHP

Sous UNIX :

Sous UNIX, le serveur doit disposer impérativement de sendmail pour envoyer un mail.

En PHP, il est possible de passer outre le sendmail grace à un wrapper. Dans tous les cas, on doit configurer, dans le php.ini, on retrouve :

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =
Sous Windows

PHP s’adresse au MTA directement via le SMTP. Pour utiliser les mails sous windows, dans php.ini, on peut renseigner l’expediteur par défaut :

ATTENTION : Le port par défaut est le port 25. On peut le modifier sous le php.ini

La sécurité

Certains hebergeurs configurent leur MTA de sorte qu’il n’accepte que les courriers sécurisés avec le protocole SASL (Simple Authentification And Security Layer).

Sous UNIX les mails sont automatiquement authentifiés et sécurisés alors que sous Windows, les mails ne sont pas sécurisés.

Si le mail est envoyé sans SASL sur un serveur SASL, php va afficher une erreur

Pour éviter ce probleme sous Windows, il faut recompiler PHP en activant PCRE (Pearl Compatible Regular Expression)

Envoi des mails en PHP

Pour envoyer des mails, on utilisera la fonction mail() qui recherchera automatiquement sendmail. Sous UNIX, il faut autoriser le droit d’acces au logiciel sendmail

mail ( destinataire , objet , message [, entetes [, options]] );

mail() va renvoyer true ou false. Des erreurs s’afficheront si et seulement si la connexion avec sendmail ne s’est pas faite ou si le temps d’execution est trop long

Destinataire
//syntaxes correctes
vous@domaine.com
vous@domaine.com, autre@domaine.com
vous @ domaine . com //le MTA va supprimer les espaces
"prenom nom" <vous@domaine.com> //le MTA va recuperer automatiquement l'adresse
vous //en local
Objet / Sujet

Le sujet ne doit surtout pas comporter de caractères de nouvelle ligne

Le message

Le message peut comporter des retours à la ligne et ils sont matérialisés par des n. Afin que ses LF soit pris en compte, on doit spécifier le message entre double quotes

Impératif : une ligne ne doit pas comporter plus de 70 caractères. Sous Windows, lorsque PHP communique directement avec le SMTP, et que le message comporte un point à la fin de la ligne, ou en début de ligne, il sera automatiquement supprimé. Pour éviter ce bug, on mettra un ..

Les entetes

Les entetes doivent être séparées entre elles avec un CRLF (rn). Le mail doit comporter dans son entête un From soit dans la fonction mail, soit dans le php.ini. Sous UNIX, certains MTA refusent le CRLF.

MIME (Multipurpose Internet Mail Extension)

Le MIME est un protocole (standard), c’est une extesnion du SMTP permettant d’envoyer des données en divers formats et/ou pieces jointes.

Pour envoyer un mail HTML, il faut spécifier au MUA que s’en est. Il faudra placer dans l’entete

Mime-Version 1.0
Content-Type: text/html, charset:"ISO-8859-1"
Content-Transfer-Encoding: 8 bits

Pour envoyer plusieurs elements dans un meme message, on devra utiliser le type MIME multipart dans le Content-Type

Les multiparts
text/plain //Permet l'envoi du fichier texte brut
multipart/mixed //Permet de spécifier l'absence de liens entre les différents blocs
multipart/alternative //Le document est sous différents blocs mais différent les uns des autres (ex: texte / image / pdf = meme document)
multipart/related //Les différents blocs sont nécéssaires pour consituer le document

Chaque bloc sera séparé par un boundary unique. On utlisera md5(time()) pour s’assurer de l’unicité du boundary.

Ecriture du message

Voir la RFC1521 sur MIME