[E-mail] Envoyer un e-mail en PHP

Formation

En Semi-présenciel Paris

Prix sur demande

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

Description

  • Typologie

    Formation

  • Méthodologie

    En semi-présentiel

  • Lieu

    Paris

Grâce à cette formation vous pourrez acquérir les connaissances nécessaires qui vous permettrons d’ajouter des compétences à votre profil et obtenir de solides aptitude qui vous offriront de nombreuses opportunités professionnelles.

Les sites et dates disponibles

Lieu

Date de début

Paris ((75) Paris)
Voir plan
7 Cité Paradis, 75010

Date de début

Consulter

Questions / Réponses

Ajoutez votre question

Nos conseillers et autres utilisateurs pourront vous répondre

À qui souhaitez-vous addresser votre question?

Saisissez vos coordonnées pour recevoir une réponse

Nous ne publierons que votre nom et votre question

Les Avis

Le programme

Introduction du cours

Comment envoyer un e-mail en PHP ?

Vous me direz : rien de plus simple ! J'utilise la fonction mail() et je lui donne le destinataire, le sujet, le contenu du courriel.

Alors oui, ça peut fonctionner, mais le gros problème est que, lorsque l'on utilise cette méthode, l'e-mail a 95 % de chances de partir dans les courriers indésirables... Ce qui n'est pas vraiment très bon pour l'expéditeur.

C'est pourquoi ce tutoriel va non seulement vous apprendre à envoyer un courriel qui arrivera (presque toujours) à son destinataire, mais aussi à envoyer un e-mail en HTML et même y ajouter une pièce jointe. ;) Eh oui, comme les annonces de publicité que vous recevez, ou encore les courriels du Site du Zéro (e-mails d'avertissement de messages privés ou la Newsletter).

Avant-propos

Pour commencer ce tutoriel, il faut tout d'abord fixer une chose : tous les serveurs qui reçoivent les e-mails ne suivent pas obligatoirement la norme, comme je viens d'en avoir la confirmation à la suite de la dernière édition de ce tuto. En effet, selon la norme que je cite quelques paragraphes plus loin, un passage à la ligne dans le code source d'un e-mail est « \r\n » ; or, certains hébergeurs remplacent le « \n » automatiquement par « \r\n », ce qui fait que l'on se retrouve avec « \r\r\n », qui occasionne certains bogues au niveau de l'affichage des e-mails.

Il existe donc deux possibilités soit on tente de filtrer les serveurs à problèmes et donc de respecter le plus souvent la norme, soit on décide de mêttre un peut la norme de coté et l'on utilise « \n » qui marche de toutes façons, au cas ou vous voudriez gérer au cas par cas, voici un petit bout de code.

<?php if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) { $passage_ligne = "\r\n"; } else { $passage_ligne = "\n"; } ?> L'en-têteDéfinition

L'en-tête d'un e-mail, aussi appelé header, est la partie qui se trouve au début d'un courriel. Elle est invisible pour l'utilisateur lambda qui ne fait que lire ses messages.

Dans ce tutoriel, j'utiliserai le mot anglais header lorsque je parlerai de l'en-tête car, comme vous le savez certainement, le langage informatique utilise pour ainsi dire toujours la langue anglaise ; il sera donc plus facile de se servir de ce terme dans le cours, car il sera réutilisé dans le code.

Le header, donc, contient toutes les informations de l'e-mail. En voici quelques exemples :

  • l'heure d'envoi,

  • l'adresse électronique de l'expéditeur,

  • l'adresse de réponse,

  • le nom du serveur qui a envoyé l'e-mail,

  • par où a transité l'e-mail chez votre FAI,

  • etc.

Eh, mais tu viens de nous dire que le header, nous, on ne le voyait pas ! Mais moi, je sais très bien à quelle heure mon e-mail a été envoyé et qui me l'a envoyé !

Alors certes, l'utilisateur lambda voit certaines de ces informations, mais c'est uniquement parce que votre logiciel de messagerie va lire le header pour ensuite vous l'afficher de manière propre.

Schéma

Lorsque vous créez le header pour envoyer un e-mail avec la fonction mail() de PHP, vous avez besoin de spécifier quatre arguments :

  • l'adresse de l'expéditeur,

  • l'adresse de retour,

  • la version de MIME,

  • le content-type du message.

Bon, maintenant, éclaircissons un peu cette liste. Les deux premiers arguments n'ont pas besoin d'explication (ou bien alors vous êtes en-dessous de zéro :p ).
Pour ce qui est de la version du MIME, il s'agit de donner la version de l'e-mail au serveur qui va le recevoir. En gros, ça permet de lui dire comment le lire. :)

Si vous voulez plus de renseignements sur le standard MIME, voici un lien : CCM.

Pour le content-type, vous l'avez peut-être déjà rencontré. Il va servir dans le cas présent à définir ce que va contenir votre e-mail. Sachez qu'il peut aussi être utilisé en HTML pour définir le contenu d'une page, ou encore en PHP lors de la génération d'une image avec une bibliothèque graphique (pour signaler à votre navigateur de quelle façon il va devoir interpréter ce qui se trouve dans la page). On verra que le content-type va devoir aussi être réutilisé plus tard dans le corps du message.

Ainsi, pour récapituler, nous avons maintenant le schéma d'un header qui ressemble à cela :

  • expéditeur,

  • adresse de retour,

  • MIME,

  • content-type.

Comment bien déclarer son header ?

Nous allons garder le même schéma que précédemment. Je vous le rappelle :

  • expéditeur,

  • adresse de retour,

  • MIME,

  • content-type.

Je vais commencer à écrire du code, à partir de maintenant. Comme je suis en train de traiter le header, je vais mettre tout ce qui le concerne dans une variable $header.

Déclaration de l'expéditeur<?php $header = "From: \"EXPEDITEUR\"<ADRESSE_EXPEDITEUR>".$passage_ligne; ?>

Certains anti-spam se basent sur la concordance entre l'expéditeur qui est présent dans la balise FROM et le serveur depuis lequel le message est envoyer pour détecter un risque de fishing (exemple depuis sav@toto.com vous envoyez un mail en tant que sav@titi.com) donc il vaut mieux coller à 100%

Pour cela si vous etes sur un serveur mutualisée pour avoir l'adresse exacte envoyez vous un email avec la fonction mail de php avec juste un destinataire, un corps et un sujet peut importe le contenu vous n'aurez qu'à regarder l'adresse de l'expéditeur pour la mettre à la place de ADRESSE_EXPEDITEUR

Déclaration de l'adresse de retour<?php $header.= "Reply-to: \"RETOUR\" <ADRESSE_RETOUR>".$passage_ligne; ?> Déclaration de la version de MIME<?php $header.= "MIME-Version: 1.0".$passage_ligne; ?> Déclaration du content-type<?php $header.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne; ?> Quelques explications

Tout d'abord, la valeur de content-type : multipart/alternative.
J'ai choisi d'utiliser celle-ci car mon tutoriel a pour but d'envoyer un e-mail en mode texte et en mode HTML (je détaillerai ces modes un peu plus tard).

Il existe également d'autres « sous-types » pour le content-type. Ici, multipart/alternative permet au programme qui reçoit l'e-mail de choisir d'afficher soit la partie HTML, soit la partie texte. Je vous donne à nouveau le lien CCM où vous pourrez trouver les autres types et leurs utilités (ils ne seront pas détaillés ici car ils feront peut-être l'objet d'un autre tutoriel).

Nous avons aussi la valeur boundary à laquelle j'ai affecté $boundary : je suis obligé de déclarer cette valeur ici, mais je vous expliquerai plus tard le contenu de la variable et son utilité.

Un exemple concret :

<?php //=====Création du header de l'e-mail $header = "From: \"WeaponsB\"<weaponsb@mail.fr>".$passage_ligne; $header .= "Reply-to: \"WeaponsB\" <weaponsb@mail.fr>".$passage_ligne; $header .= "MIME-Version: 1.0".$passage_ligne; $header .= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne; //========== ?> 1er bilan

Dans cette première partie, nous avons donc appris de quoi était constitué le header d'un e-mail et comment en créer un à notre convenance. Dans la prochaine partie, nous verrons les différents types de courriels et aussi le code à utiliser pour les déclarer.

Les différents types d'e-mailsDéfinition

J'imagine que vous avez tous reçu des e-mails au moins une fois dans votre vie. ^^ Vous avez donc eu la possibilité de constater que certains possèdent de belles images et une belle mise en forme. Par exemple :

Format Html

Au format HTML

Format texte

Au format texte

Hum mais pourquoi existe-il deux format ?

Tous simplement car selon le client mail qui va lire votre message, il ne sauras pas forcément afficher la partie HTML. Par défaut les clients mail tente de convertir l'HTML en texte mais vous voudrez peut-être afficher un texte différent selon les cas

Comme nous allons envoyer un e-mail en mode texte et en mode HTML, il va nous falloir deux variables : la première contenant le contenu de l'e-mail en mode texte que l'on appellera $message_txt, et la seconde, qui contiendra l'e-mail au format HTML, au nom de $message_html. Mais attention : ces messages devront OBLIGATOIREMENT se terminer par un \n.

Comment faire une déclaration de type ?

Pour effectuer une déclaration de type, il faut utiliser trois paramètres :

  • Content-Type : XXX/XXX; charset=XXXXXX

  • Content-Transfer-Encoding : XXXXXXXXXX

Si l'on veut traduire cette partie en code PHP, on obtiendra quelque chose comme cela :

<?php $message = "..."; $message .= "Content-Type: XXX/XXX; charset=\"XXXXXX\"".$passage_ligne; $message .= "Content-Transfer-Encoding: XXXXXXXXXX".$passage_ligne; $message .= "..."; ?>

Pour information, j'utilise ici une nouvelle variable $message. Cette variable sera envoyée à la fonction mail() et contiendra l'intégralité du contenu de l'e-mail (texte et code HTML).
Vous aurez aussi remarqué que j'ai ajouté « ... » avant et après ma déclaration de type. C'est parce qu'en temps normal, il y a autre chose avant et après la déclaration. Je l'aborderai plus tard dans ce tutoriel.

Quelques explications

Tout d'abord, le content-type (eh oui encore lui, mais je vous avais dit qu'il reviendrait :) ).
Ici, il va servir à dire si l'on veut placer à la suite du texte ou du code HTML.

  • Mode Texte => text/plain

  • Mode HTML => text/html

Passons au charset. Il va servir à définir le type d'encodage des caractères qui vont suivre.
J'ai utilisé ici le charsetiso-8859-1 car il est supporté par tous les webmails, contrairement à l'UTF-8.
L'UTF-8 peut être utilisé pour l'envoi d'un e-mail multilingue (chinois, arabe...).

Maintenant, le dernier point : le Content-Transfer-Encoding. Ce paramètre permet de définir sur combien de bits sera encodé le message, ce qui détermine en fait le nombre de caractères différents possibles.
Petit exemple : un e-mail avec un Content-Transfer-Encoding réglé sur 7 bits ne pourra comprendre que 128 caractères différents.

Citation : Cours de maths

Nombre de caractères = 2n (bits)
Donc un message sur 7 bits donnera : 27 = 128
et un message sur 8 bits : 28 = 256
etc.

Maintenant, cela va donc dépendre de ce que vous écrivez dans votre courriel. Si vous souhaitez utiliser des accents, vous devrez obligatoirement régler le Content-Transfer-Encoding sur 8 bits. :)

Ainsi, si nous appliquons ce qui se trouve ci-dessus, on devrait se retrouver, pour une déclaration de mode HTML, avec ceci :

<?php $message = "..."; $message .= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne; $message .= "Content-Transfer-Encoding: 8bit".$passage_ligne; $message .= "..."; ?> 2e bilan

Eh bien nous y voilà ! :)
Maintenant, nous savons comment définir ce que nous allons placer dans notre courriel. On avance sur le chemin de la quête de l'e-mail qui ne part pas à la corbeille. :p Il ne nous reste plus qu'à voir comment faire la jonction entre les différentes parties.

Et c'est parti pour l'assemblage !

À vos marques, prêts ? Assemb... STOP !!!

Eh non, ce n'est pas encore pour tout de suite. :lol: Non, ne me regardez pas avec ces yeux-là ! Oui, ceux-là ! :colere2:
Ça va bientôt venir, mais il faut que je vous explique une dernière chose avant de pouvoir vous lancer.

Boundary

Je vais enfin vous expliquer ce que contient la fameuse variable $boundary. :)
Tout d'abord, pour vous donner une idée, boundary se traduit en français par frontière.

Boundary va donc nous permettre de séparer les différentes parties de notre e-mail, et c'est OBLIGATOIRE. On pourrait les considérer comme des super-balises.

Le format d'une boundary est le suivant :

Citation : Format

----=Chaîne_aléatoire

Pour générer cette chaîne, nous allons utiliser...

Appeler le centre

Avez-vous besoin d'un coach de formation?

Il vous aidera à comparer différents cours et à trouver la solution la plus abordable.

[E-mail] Envoyer un e-mail en PHP

Prix sur demande