1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
| <?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 http://blog-du-grouik.tinad.fr février 2012
* Distribué sans aucune garantie dans les conditions établies là http://blog-du-grouik.tinad.fr/pages/Mentions-l%C3%A9gales
*
* Vous ne devez pas supprimer ce bloc de commentaires.
*
*/
/*
* *** 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);
}
?> |
Partager