Voir la page Facebook de Dewep.net Voir la page Google Plus de Dewep.net Voir la page Twitter de Dewep.net

Tutoriel - Envoyer un mail en PHP

CC BY-NC-SA 3.0

L'ensemble des tutoriels est soumis à la licence CC BY-NC-SA 3.0 (Code Juridique).
Vous êtes donc libre de remixer et partager l'oeuvre aux conditions de l'attribuer (lien vers cette page), de ne pas l'utiliser à des fins commerciales, et de la partager avec une licence identique ou similaire.

- Envoyer un mail au format HTML
- Envoyer un mail sans qu'il se loge dans le courrier indésirable


Nous verrons dans ce tutoriel comment, en PHP, faire pour :
  • Envoyer un mail au format HTML
  • Envoyer un mail en évitant au maximum qu'il se loge dans le courrier indésirable





Général


Pour commencer, je vais vous présenter l'utilisation de la fonction PHP mail() :





La variable $to

$to contient le ou les destinataires de l'E-Mail. Les destinataires peuvent être de la forme :



Pour ajouter un autre contact, il suffit d'ajouter une virgule :



Remarques :
  • Éviter les caractères spéciaux dans les noms des contacts, cela évitera que l'E-Mail soit considéré comme indésirable
  • Afin de rendre plus facile ce tutoriel, la première manière sera utilisée




La variable $sujet

C'est l'objet de l'E-Mail.
Il faut également éviter les caractères spéciaux.


La variable $message

Cette variable contient le corps du message.

Remarques :
  • Chaque ligne doit être séparée par un "\n\r"
  • Les lignes ne doivent pas comporté plus de 70 caractères (C'est pratiquement ingérable, ce n'est pas grave si on dépasse)




La variable $headers

Cette variable sert à ajouter des en-têtes supplémentaires (From, Cc, Bcc, ...).
Les en-têtes supplémentaires doivent être séparés par "\r\n".


Un autre paramètre ?

Un autre paramètre est possible, mais nous ne l'utiliserons pas :
"php.net" a écrit : Le paramètre additional_parameters peut être utilisé pour passer des drapeaux additionnels comme options à la ligne de commande configurée pour être utilisée pour envoyer les mails en utilisant le paramètre de configuration sendmail_path. Par exemple, ceci peut être utilisé pour définir l'enveloppe de l'adresse de l'expéditeur lors de l'utilisation de sendmail avec l'option -f.

L'utilisateur sous lequel tourne le serveur web doit être ajouté en tant qu'utilisateur de confiance dans la configuration de sendmail afin que l'en-tête X-Warning ne soit pas ajouté au message lorsque l'enveloppe de l'expéditeur (-f) est défini en utilisant cette méthode. Pour les utilisateurs de sendmail, ce fichier est /etc/mail/trusted-users.




Passage à la ligne


Un passage à la ligne dans le code source d'un mail doit être : "\r\n".
Cependant, la messagerie Microsoft (hotmail/live) remplace le "\n" automatiquement par "\r\n" ; ce qui fait que l'on se retrouve avec "\r\r\n".


Pour régler ce petit soucis :





Boundary


Un Boundary (Boundary = Frontière) va servir à ce que votre E-Mail ressemble à un "vrai" E-Mail.
Le Boundary va donc nous permettre de séparer les différentes parties de notre e-mail, et c'est quasiment obligatoire pour que votre E-Mail ne se retrouve pas dans les indésirables.

Un Boundary s'ouvre comme ceci :

Et se referme ainsi :


Pour faire la chaîne aléatoire, une des méthodes est :

La fonction rand() permet d'obtenir un nombre aléatoire, puis la fonction md5() permet de hacher cette chaîne.


A la fin, l'E-Mail devra être de la forme :
Headers
Ouverture boundary
Déclaration de type Texte
Texte
Ouverture boundary
Déclaration de type HTML
HTML
Fermeture boundary
Fermeture boundary


Afin d'éviter une fois de plus le courrier indésirable, il faut aussi fournir l'E-Mail sans aucun HTML.

Vu que l'E-Mail n'affichera théoriquement que le format HTML, il vous est possible de mettre un autre texte (tout de même déconseillé).


Prenons un exemple :

Format texte :
Vous avez reçu une nouvelle réponse sur votre sujet : "Envoyer un Mail en PHP". Voici le lien : http://lien.com/view.php?topic=ID


Maintenant le format HTML :


Le format HTML est bien plus joli, mais le format texte est indispensable.

Il existe cependant une fonction PHP : strip_tags.
Celle-ci permet de retourner seulement la partie texte de votre code HTML.

Cela peut être très pratique ici.
Plus d'informations sur php.net.




Headers


Les Headers de l'E-Mail, ce sont ses en-têtes.

Voilà ce que devront être les headers de votre E-Mail :


  • L'adresse E-Mail de l'expéditeur
  • L'adresse E-Mail pour la réponse à l'E-Mail (logiquement la même)
  • La version de l'E-Mail
  • Le type du contenu de l'E-Mail (on choisit multipart/alternative car il y aura Texte + HTML)






Message


Nous avons vu qu'il fallait créer deux textes (Un au format HTML, et un au format TEXTE).

Nous allons arranger notre message comme ceci :
Ouverture Boundary (1)
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: 8bit
Message au format texte
Ouverture Boundary (2)
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: 8bit
Message au format HTML
Fermeture Boundary (2)
Fermeture Boundary (1)


Comme vous avez pu le voir, il faut aussi préciser le Content-Type et le Content-Transfer-Encoding.

En PHP, voilà ce que ça nous donne :




Code complet


On regroupe donc tout cela :





Questions / Remarques / Améliorations ?


N'hésitez pas à me contacter pour toutes questions / remarques / ou amélioration : http://dewep.net/Contact