mercredi 25 avril 2012

Faire un mail avec pièces jointes


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

?>

Aucun commentaire:

Enregistrer un commentaire