Envoi de mail avec une pièce jointe
Beaucoup de gens souhaitent envoyer un mail avec une pièce jointe en PHP mais ne savent comment faire.
Cette page va vous expliquer comment envoyer des courriels avec des fichiers attachés.

Le script

La première chose à faire est de définir une frontière qui séparera les différentes parties du mail.

Combien y a-t-il de parties dans un mail???

Il y en a trois. En premier, l'en-tête du mail indiquant qu'il y aura un fichier joint. Ensuite se trouvera le message du mail et pour finir, la pièce jointe.

La frontière est une chaine de caractères assez longue et compliquée que pour qu'elle n'aie aucune chance de se retrouver dans le mail. Cette frontière ne pourra en aucun cas comporter d'espaces ni de caractères accentués. Prenons par exemple cette frontière:

<?php
$frontiere = 'ceciestunefrontierequineseretrouverajamaisdanslemail';

Nous allons maintenant nous attaquer aux en-têtes du mail. Elles sont toujours terminées par "\n" qui est le symbole pour aller à la ligne. En effet, il ne peut y avoir qu'une seule information d'en-tête par ligne.
D'abord, il faut indiquer l'adresse qui l'envoie et celle à qui il faut répondre. Ensuite, nous indiquerons la version des types MIME utilisés:

$en_tetes = "Reply-to:moi@mon_site.be\n";
$en_tetes .= "From: toi@ton_site.be\n";
$en_tetes .= "MIME-Version: 1.0\n";

Qu'est-ce que les types MIME?

Les types MIME servent à "décrire" le format du fichier. Pour du CSS par exemple, le type MIME est "test/css". Vous pourrez trouver une liste des types MIME à cet endroit

Continuons nos en-têtes:

$en_tetes .= "Content-Type: multipart/mixed;\n";

C'est ici la partie cruciale des en-têtes. En effet, "multipart/mixed" indique qu'il y aura plusieurs parties au mail et, donc, une pièce jointe.
Nous allons maintenant indiquer que la frontière que nous avons préparé est celle qui va séparer le mail.

$en_tetes .= " boundary=\"----=$frontiere\"\n\n";

Les en-têtes sont maintenant terminées. Nous pouvons passer à la seconde partie du mail, le message. Mais auparavant, il va falloir insérer la frontière pour séparer les en-têtes du corps du courriel.

$message = "------=$frontiere\n";

Avant de taper le message proprement dit, nous allons ajouter deux lignes d"en-têtes" pour le message, c'est à dire:
-le type de contenu (texte ou mail en HTML) + le jeu de caractères
-le type d'encodage.

$message .= "Content-Type:text/plain; charset=\"ISO-8859-1\"\n";
$message .= "Content-Transfert-Encoding: 8bit\n\n";
//Maintenant, on passe au message

$message .= 'Ceci est un superbe mail avec une pièce jointe!!!';
$message .="\n\n";

Nous avons terminé le message du mail par deux "Enter" (\n) pour marquer un espace avant la pièce jointe. Comme nous changeons maintenant de partie du mail, il faut encore une fois mettre la frontière. Ensuite, il y aura l'en-têtedu la pièce jointe. Voici les informations qu'il faudra y mettre:
-le type MIME du fichier + son nom
-le type d'encodage du fichier
-la disposition du fichier + son nom lors de l'arrivée du mail.
Pour cet exemple, je vais envoyer un fichier PDF "nommé acrobat.pdf".

$piece_jointe = "------=$frontiere\n";
$piece_jointe .= "Content-Type: application/pdf; name="acrobat.pdf"\n";
$piece_jointe .= "Content-Transfer-Encoding: base64\n";
$piece_jointe .= "Content-Disposition: attachment; filename="fichier_secret.pdf"\n\n";

Le type d'encodage sera toujours "base64". Il faudra donc encoder la pièce jointe dans ce format. Mais avant, nous allons ouvrir ce fichier joint et stocker son contenu dans une variable. Rien de très difficile, vous l'avez déjà fait.

$ouverture = fopen('acrobat.pdf', 'r');
//Pas besoin de plus de "pouvoir" que la lecture du fichier.  Je mets donc "r".

$contenu = '';
while(!feof($ouverture)){
$contenu .= fgets($ouverture, 2048);
}
fclose($ouverture);

Il faut maintenant encoder le fichier en base64. Pour ce faire, PHP dispose d'une fonction native. Mais, en plus de l'encoder dans ce format, il faut la rendre conforme au mail. Encore une fois, il existe une fonction toute faite. Il ne reste plus alors qu'à écrire la pièce jointe dans la variable $piece_jointe.

$contenu = base64_encode($contenu);
//Encodage au format base64
$contenu = chunk_split($contenu);
//On rend la pièce jointe conforme
$piece_jointe .= $contenu;
//Et on l'insère dans la variable.

Le mail est maintenant presque terminé. Il suffit juste de fermer une dernière fois la frontière, d'envoyer le mail et le tour est joué!

$piece_jointe .= "\n\n\n------=$frontiere\n";
$mail = $message.$piece_jointe;
//On regroupe les deux morceaux en un seul.

mail('moi@mon_site.be', 'Mail avec pièce jointe', $mail, $en_tetes);

Vous avez maintenant envoyé votre mail. Cependant, il est plus pratique de créer une fonction pour envoyer les mails en pièce jointe. Ce n'est pas très difficile et ça fait en même temps un récapitulatif du code. Voici la fonction:

function mail_fichier($adresse, $sujet, $texte_mail, $fichier_joint, $mime){
$frontiere = 'ceciestunefrontierequineseretrouverajamaisdanslemail';
$en_tetes = "Reply-to:moi@mon_site.be\n";
$en_tetes .= "From: toi@ton_site.be\n";
$en_tetes .= "MIME-Version: 1.0\n";
$en_tetes .= "Content-Type: multipart/mixed;\n";
$en_tetes .= " boundary=\"----=$frontiere\"\n\n";

$message = "------=$frontiere\n";
$message .= "Content-Type:text/plain; charset=\"ISO-8859-1\"\n";
$message .= "Content-Transfert-Encoding: 8bit\n\n";

$message .= $texte_mail;
$message .="\n\n";

$piece_jointe = "------=$frontiere\n";
$piece_jointe .= "Content-Type: $mime; name=\"$fichier_joint\"\n";
$piece_jointe .= "Content-Transfer-Encoding: base64\n";
$piece_jointe .= "Content-Disposition: attachment; filename=\"$fichier_joint\"\n\n";

$ouverture = fopen($fichier_joint, 'r');

$contenu = '';
while(!feof($ouverture)){
$contenu .= fgets($ouverture, 2048);
}
fclose($ouverture);

$contenu = base64_encode($contenu);
$contenu = chunk_split($contenu);
$piece_jointe .= $contenu;

$piece_jointe .= "\n\n\n------=$frontiere\n";
$mail = $message.$piece_jointe;

mail($adresse, $sujet, $mail, $en_tetes);
}//Fin de la fonction

Ce script est maintenant terminé. Vous savez envoyer des mails avec pièce jointe et vous avez une fonction toute prête.

Creative Commons License
Sauf mention contraire, le contenu de cette page est sous licence Creative Commons
Page générée en 0.4174 secondes.
Retour en haut de la page
Imprimer cette page