Mail
18/04/2016

PHP : Envoi d’un mail avec pièce jointe

Tags : ,

Le jour où j’ai du créer un formulaire permettant d’envoyer un mail avec pièce jointe, j’ai mis un certain temps avant de résoudre ce problème. En effet, malgré de nombreux tutos trouvés sur Internet, qu’ils soient français ou anglais, je n’ai jamais réussi à faire marcher complètement leur code, notamment pour Gmail. Pour finir, ce n’est qu’après avoir afficher le code source d’un mail pour essayer de le décrypter que j’ai réussi à envoyer le fameux mail.
Alors pour vous éviter la même galère, voici un petit tuto.

Créer le formulaire

Tout d’abord, il nous faut un formulaire pour appeler le fichier qui s’occupera d’envoyer le mail.
Dans ce formulaire, nous autorisons l’utilisateur à envoyer une image en JPEG ou un PDF avec une taille maximale de 2Mo. On lui demande également son nom, son mail et un message. La partie action=’mail.php’ permet d’indiquer que le formulaire envoie ses données au fichier mail.php quand l’utilisateur appuie sur le bouton Envoyer.

Récupération des données

Créons maintenant le fichier mail.php. Vu que notre formulaire utilise la méthode POST pour envoyer les données, on les récupère avec $_POST[‘nom_de_la_variable’]. Si nous avions utilisé la méthode GET on aurait utilisé $_GET[‘nom_de_la_variable’]. Le nom de la variable est ce qui a été saisi dans l’attribut « name » de chaque input, ici nom, email et message. Pour éviter des problèmes comme une insertion de script on utilise la fonction htmlentities() pour sécuriser nos données.

Pour signifier un passage à la ligne on peut utiliser soit \r\n soit \n. Cependant tous les fournisseurs ne prennent pas en charge le \n seul. Pour cela on vérifie si ce dernier le supporte, en vérifiant si l’adresse entrée est chez hotmail, live ou msn (qui le supportent).

Finalement on configure l’adresse mail à laquelle doit être envoyer le mail (ici moi-même), on écrit le sujet du mail que l’on veut recevoir (il est également possible de le récupérer via le formulaire si vous avez un champ « Sujet » par exemple), et on crée une clé aléatoire de limite ou boundary. Cette boundary permet de séparer le corps du message de la pièce jointe et ainsi permettre son envoi.

Nettoyer le message

Pour éviter que l’utilisateur puisse entrer des données qui provoquerait un mal fonctionnement du mail, on crée une fonction qu’on utilisera pour nettoyer le contenu du message.

Création du mail

Voilà la partie importante ! La création du mail. Commençons par le header qui permet de dire de la part de qui est le message et le type de contenu. On insère les données dans les différents champs. From donne des informations sur l’émetteur du message (l’utilisateur ici), Reply-to indique à qui on envoie un mail lorsqu’on cliquera sur le bouton répondre, MIME-Version permet d’indiquer que le contenu du message est formaté en MIME et Content-Type permet d’indiquer quel type de contenu est envoyé (par exemple du texte simple ou du html).
Les .= signifient $headers = $headers.’chaine_de_caractères’. Cela veut dire qu’on ajoute du contenu en plus de celui déjà présent dans la variable.

Maintenant que l’on a configuré le début de mail, il nous faut afficher le contenu du message. On ouvre tout d’abord la boundary en n’oubliant pas les ‘–‘ avant. On précise ensuite que le message est du texte simple codé en UTF-8 (cela évite des caractères qui s’affichent mal), puis on défini l’encodage de transfert. Finalement on entre le contenu de message nettoyé.

Ajout de la pièce jointe

Le moment tant attendu ! L’ajout de la pièce jointe. On stocke tout d’abord le format du fichier envoyé, la taille du fichier et son nom. On vérifie que ce n’est pas un .htaccess, ce qui pourrait causer de gros problèmes. Si ce n’est pas le cas on vérifie que le format du fichier est bien un JPEG ou un PDF. Si c’est le cas on vérifie que le fichier fait moins de 2Mo. On remplace les caractères spéciaux par des caractères latin, puis on prépare le fichier pour l’envoi. Finalement on ouvre à nouveau la boundary pour signifier un nouveau contenu (une pièce jointe), on écrit les différentes informations concernant le contenu et on ajoute la pièce jointe.

Si une des vérifications n’est pas validée on envoie à la place de la pièce jointe un message d’erreur dans le mail expliquant le problème pour nous permettre de recontacter l’utilisateur si besoin. Ce n’est pas nécessaire si vous avez au préalable réalisé une vérification des données du formulaire en Javascript par exemple. Puis on ferme la boundary pour signifier la fin du mail.

Envoi du mail

La partie la plus simple, pour laquelle vous n’avez sûrement pas besoin d’aide, l’envoi du mail.
Nous avons fait en sorte que lorsque l’envoi du mail est bien réalisé on redirige vers la page du formulaire (ici index.html).

 

Voilà vous savez maintenant envoyer un mail avec pièce jointe en PHP avec la fonction mail().
Si vous souhaitez télécharger directement le fichier mail.php avec seulement quelques informations à modifier (comme l’adresse mail d’envoi), vous pouvez le faire ici.

Commentaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *