Bonjour à tous,
Content de vous
savoir la entrain de lire ce billet. Aujourd'hui, nous allons aborder un
concept que beaucoup connaissent, du moins en font l'expérience au quotidien :
L'envoi de mail en PHP
Alors la vous me
dite, à quoi bon puisque une simple fonction permet de le faire; la je vous
donne raison. Mais ici on va pas se contenter de faire un envoi de mail simple,
mais un envoi de mail avec pièces jointes. Et la surement vous vous dites, cela
devient intéressant (du moins je le pense , hihihi !!!!!!! )
Plus sérieusement,
comme vous le savez PHP dispose d'une fonction pour l'envoi de mail. La fonction mail(); elle prend 4
paramètres :
- Le destinataire
- Le sujet du message
- Le message
- l'entête
Des 4 paramètres
listés, l'entête paraît le moins incompréhensible, et pourtant il n'est pas si
difficile que cela. L'entête comme son
nom l'indique, c'est l'entête du
message. Il permet de spécifier quel type
de message on a ( message simple, message html, message avec pièces
jointes, …), il permet aussi de signer le message en renseignant le nom et
l'adresse email de l'expéditeur. Voila entre autres ces principales
fonctionnalités.
Ainsi donc comme
vous le constatez, faire un mail en PHP est extrêmement simple. Il vous faut
juste exécuter la fonction mail en vous assurant que le serveur smtp est
opérationnel. Pour infos, le serveur smtp (simple mail transfert protocol) est
le serveur d'envoi de mail. c'est le cas chez la plupart des hébergeurs.
Pour faire un mail
avec pièces jointes, la stratégie est quelques peu différentes de la stratégie
normale d'envoi de mail. Ici on utilise ce que l'on appelle délimiteur ( en
anglais boundary) pour différencier le texte de nos pièces jointes. Une fois
tout cela délimiter et attaché au message, celui peut être envoyé sans soucis.
Le graphique ci-dessous résume la situation :
Bien, la je pense
que le concept a été compris. Passons maintenant à la phase pratique de notre
code. Avant toute chose, il faut savoir que
le délimiteur est une chaine de caractère qui ne doit en aucun cas se
retrouver dans votre message, vous comprenez pourquoi je suppose. Car s'il venait à s'y retrouver, votre
message serait découper car le programma
croira que c'est une limite. Ainsi la plupart du temps, on utilise une chaine
de caractère dont la probabilité d'apparition dans notre message tend vers 0.
Dans notre exemple,
on utilise la chaine
"bonsangkescekilestmauvaiscetarbitreilfaitpashonneur", vous pouvez
utiliser autre chose, à condition de respecter ce qui a été dit au paragraphe
précédent.
Bon la partie
pratique maintenant :
<?php
$boundary="bonsangkescekilestmauvaiscetarbitreilfaitpashonneur";
// on définit notre
délimiteur
$nom="Glieunou"; $email="blog@glieunou.com";
$entete='From:
'.$nom.' <'.$email.'>'."\n";
(1)
$entete.= 'Mime-Version:
1.0'."\r\n"; (2)
$entete.= 'Content-Type:
multipart/mixed;boundary='.$boundary."\r\n"; (3)
$entete.= "\r\n"; (4)
// on définit notre
entête. $nom et $email seront présenté dans le mail comme les données de
l'expéditeur. La ligne (3) est importante lorsque l'on fait un mail avec pièces
jointes. Dans le cas d'un mail simple ou d'un simple mail html la présentation
de l'entête est différente
$message='--'.$boundary."\r\n";
$message.='Content-type:text/plain;
charset=iso-8859-1'."\r\n";
// on commence notre
$message en affectant le délimiteur comme indiqué notre schéma ci-dessus. Pour
rappel, le délimiteur nous permettra de sectionner notre message en blog.
$message.='…..';
// la ligne
précédente représente la définition de notre message. n'oublier pas que \n\r
représente le saut à la ligne
$targetpath='./tmp/fichier.txt';
// $targetpath
représente notre variable fichier, notre fichier en question se trouve dans le
répertoire tmp et se nomme fichier.txt; la configuration peut être différente
pour vous. Il faut aussi avoir à l'esprit que la pièce jointe peut venir d'un
upload, peut être dans le cas d'un envoi de cv, alors vous devez dans un
premier temps faire l'upload dans un dossier de votre serveur, et c'est depuis
ce dossier que vous irez chercher le document à attacher à votre mail.
/*
file_get_contents() permet de lire le
contenu d'un fichier, elle retourne la valeur en paramètres dans une chaine de
caractères */
$fichier=file_get_contents($targetpath);
/* On
utilise aussi chunk_split() qui organisera comme il faut l'encodage fait en
base 64 pour se conformer aux standards */
$fichier=chunk_split(
base64_encode($fichier) );
$file_name
='fichier.txt';
$file_type
= filetype($file_name);
$file_size
= filesize($file_name);
//Écriture
de la pièce jointe
$message.=
'--'.$boundary."\r\n";
//
comme pour le message, on commence l'écriture en initialisant le délimiteur
$message.=
'Content-type:'.$file_type.'; name='.$file_name."\r\n";
$message.=
'Content-transfer-encoding:base64'."\r\n";
$message.=
'Content-disposition: attachment; filename='.$file_name."\r\n\n
".$fichier;
// Fin
$message.=
'--'.$boundary.'--';
// il est important
de mettre le délimiteur pour signaler la fin du message. Ainsi, notre message à
trois blog.
NB : un message peut
avoir plusieurs pièces jointes, pour les ajouter vous allez devoir repeter la
section en rouge ci-dessous pour chaque pièce jointe.
mail($dest,$sujet,$message,$entete);
// on finit par
l'envoi de notre mail et cela grace à la fonction standard de php
Ainsi ce termine ce
nouveau tuto, et je vous remercie d'avance de vos lectures
?>