Php, générer un e-mail avec plusieurs pièces jointes.
Voici une fonction pour envoyer un e-mail en PHP avec des pièces jointes quelque soit leur extension (ou presque).
La machine qui m'a servi à faire les tests est un champs MX du domaine, et l'adresse de l'expéditeur appartient au domaine (ça aide.)
Le résultat des essais:
- Vers une boite e-mail free -> OK
- Vers une boite e-mail du travail (c'est un postfix maison) -> OK
- Vers une boite hotmail -> OK
- Vers une boite aol: ça passe dans les spam
- Vers une boite gmail -> OK
Plusieurs façons de fournir les pièces jointes sont possibles. les explications sont données au deuxième bloc de commentaire.
L'écriture de ce script a été possible grace à un tutoriel du site du zéro qui m'a bien servi de support.
Voici quelques exemples d'utilisation (qui m'ont servi pour les tests):
//on post files SendEmailwidthJoin($_POST['messageTXT'],$_POST['messageHTML'],$_POST['destinataire'],$_POST['expediteur'],$_FILES,$_POST['objet']); // on array files SendEmailwidthJoin($_POST['messageTXT'],$_POST['messageHTML'],$_POST['destinataire'],$_POST['expediteur'],array('/var/www/AAPC.doc','/var/www/consultation.doc'),$_POST['objet']); //juste un string SendEmailwidthJoin($_POST['messageTXT'],$_POST['messageHTML'],$_POST['destinataire'],$_POST['expediteur'],'/var/www/AAPC.doc',$_POST['objet']);
Voici la function:
<?php function FilePathToArray($leFichier) { if (!file_exists($leFichier)){ return false; } $AboutTheFile=pathinfo($leFichier); return array( 'chemin' => $leFichier, 'nom' => $AboutTheFile['filename'], 'extension'=>$AboutTheFile['extension'], 'mimeType'=> mime_content_type($leFichier),// mime_content_type est une function obsolète (je sais), mais bien pratique. 'contenu' => chunk_split(base64_encode(file_get_contents($leFichier))) //ounch les ressources ); } function SendEmailwidthJoin($message_txt,$message_html,$destinataire,$expediteur,$fichiersAJoindre,$objet,$replyTo="" ) { /* * Envoie un e-mail "propre" avec des pièces jointes * * Codé par gnieark https://blog-du-grouik.tinad.fr février 2012 * Distribué sans aucune garantie dans les conditions établies là https://blog-du-grouik.tinad.fr/pages/Mentions-l%C3%A9gales * * Vous ne devez pas supprimer ce bloc de commentaires. * * La création de ce code est en tres grande partie basée sur le tutoriel de Weaponsb qui a sévi sur le site du zéro: * "Envoyer un e-mail en PHP" http://www.siteduzero.com/tutoriel-3-35146-e-mail-envoyer-un-e-mail-en-php.html * */ /* * *** How to use this function *** * $fichiersAJoindre peut être: * - un string contenant le chemin vers un seul fichier * - un array sous la forme array('Chemin/Vers/Fichier1.ext','/chemin/vers/fichiers2', etc...); * - un array structuré comme la super variable globale PHP $_FILES: * $array('file1' => array(' * 'name' => , * 'type' => , * 'tmp_name' => , * 'error' => , * 'size' => ), * 'file2' => array( * (..)etc) * ) * /!\ Aucune vérification sur du directory transversal n'est faite au niveau de cette function. * En cas de variables fournies par l'utilisateur, prenez le soin de protéger en amont de cette function. * $message_txt (obligatoire contient le message au format txt) * $message_html facultatif (envoyez une string vide "" si vous ne souhaitez pas envoyer votre message en html) * $destinataire : 'nom@fai.com' ou '"Nom Prenom<nom@fai.com>"' ou '"Nom1 Prenom1<nom1@fai.com>,Nom2 Prenom2<nom2@fai.com>"' * $expediteur: idem * $replyTo: facultatif, si différent de l'expéditeur. */ //=== vérifier et préparer les pieces jointes: $arrayFiles=array(); if (is_string($fichiersAJoindre)){ $lesFichiers[]= FilePathToArray($fichiersAJoindre); } if (is_array($fichiersAJoindre)){ //tester si c'est du type $_FILES if ((isset($fichiersAJoindre[0])) AND (is_string($fichiersAJoindre[0])) ){ //un array simple avec des strings foreach($fichiersAJoindre as $stringFile){ $lesFichiers[]= FilePathToArray($stringFile); } }else{ //de type $_FILES foreach($fichiersAJoindre as $arrayFiles){ $aboutFile=pathinfo($arrayFiles['name']); $lesFichiers[]=array( 'chemin' => getenv('TMP')."/".$arrayFiles['tmp_name'], 'nom' => $aboutFile['filename'], 'extension'=>$aboutFile['extension'], 'mimeType'=> mime_content_type(getenv('TMP')."/".$arrayFiles['tmp_name']),// mime_content_type est une function obsolète (je sais), mais bien pratique. 'contenu' => chunk_split(base64_encode(file_get_contents($arrayFiles['tmp_name']))) //ounch les ressources ); } } } //===générer les délimiteurs dans l'email === do{ $leRand=md5(rand()); $boundary = "-----=".$leRand; }while(!strpos($message_txt.$message_html, $leRand) === false); // oui, la vérification là , c'est du zèle. do{ $leRand=md5(rand()); $boundary_alt = "-----=".md5(rand()); $isOK=true; foreach($lesFichiers as $fichier){ if(!strpos($fichier['contenu'], $leRand) === false){ $isOK=false; } } }while($isOK==false);//là en plus d'etre du zele, ça bouffe les ressources //=== le type de retour à la ligne === if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $destinataire)){ $passage_ligne = "\r\n"; }else{ $passage_ligne = "\n"; } //=== header === $headers ="From: ".$expediteur.$passage_ligne; if ($replyTo==""){ $headers.= "Reply-to: ".$expediteur.$passage_ligne; }else{ $headers.= "Reply-to: ".$replyTo.$passage_ligne; } $headers.= "MIME-Version: 1.0".$passage_ligne; $headers.= "Content-Type: multipart/mixed;".$passage_ligne." boundary="".$boundary.""".$passage_ligne; //=====Création du message. $message = $passage_ligne."--".$boundary.$passage_ligne; $message.= "Content-Type: multipart/alternative;".$passage_ligne." boundary="$boundary_alt"".$passage_ligne; //=====Ajout du message au format texte. if ($message_txt!=""){ $message.= $passage_ligne."--".$boundary_alt.$passage_ligne; $message.= "Content-Type: text/plain; charset="ISO-8859-1"".$passage_ligne; $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne; $message.= $passage_ligne.$message_txt.$passage_ligne; } //========== //=====Ajout du message au format HTML. if ($message_html!=""){ $message.= $passage_ligne."--".$boundary_alt.$passage_ligne; $message.= "Content-Type: text/html; charset="ISO-8859-1"".$passage_ligne; $message.= "Content-Transfer-Encoding: 8bit".$passage_ligne; $message.= $passage_ligne.$message_html.$passage_ligne; //On ferme la boundary alternative. $message.= $passage_ligne."--".$boundary_alt."--".$passage_ligne; } //========== //pièces jointes foreach($lesFichiers as $fileArray) { $message.= $passage_ligne."--".$boundary.$passage_ligne; $message.="Content-Type: ".$fileArray['mimeType']."; name="".$fileArray['nom'].".".$fileArray['extension'].""".$passage_ligne; $message.="Content-Transfer-Encoding: base64".$passage_ligne; $message.="Content-Disposition: attachment; filename="".$fileArray['nom'].".".$fileArray['extension'].""".$passage_ligne; $message.= $passage_ligne.$fileArray['contenu'].$passage_ligne.$passage_ligne; } $message.= $passage_ligne."--".$boundary."--".$passage_ligne; //echo $message; //Envoi du mail mail($destinataire, $objet, $message, $headers); } ?>
l'icone "e-mail" en en tête de ce billet provient du site economie-numerique.net