X-Git-Url: http://git.cyclocoop.org/?p=ptitvelo%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fplugins%2Ffacteur%2Finc%2Fenvoyer_mail.php;fp=www%2Fplugins%2Ffacteur%2Finc%2Fenvoyer_mail.php;h=261c7c159b1bf25be9093883864089db1753635a;hp=0000000000000000000000000000000000000000;hb=a463177039939e8c9294e065d7505f8de95d48c2;hpb=5be150361b3c836d9206941ba43f862df11466db diff --git a/www/plugins/facteur/inc/envoyer_mail.php b/www/plugins/facteur/inc/envoyer_mail.php new file mode 100644 index 0000000..261c7c1 --- /dev/null +++ b/www/plugins/facteur/inc/envoyer_mail.php @@ -0,0 +1,230 @@ + fonctionnalites etendues + // avec entrees possible : html, texte, pieces_jointes, nom_envoyeur, ... + if (is_array($corps)) { + $message_html = $corps['html']; + $message_texte = nettoyer_caracteres_mail($corps['texte']); + $pieces_jointes = $corps['pieces_jointes']; + $nom_envoyeur = $corps['nom_envoyeur']; + $from = (isset($corps['from'])?$corps['from']:$from); + $cc = $corps['cc']; + $bcc = $corps['bcc']; + $repondre_a = $corps['repondre_a']; + $adresse_erreur = $corps['adresse_erreur']; + $headers = (isset($corps['headers'])?$corps['headers']:$headers); + if (is_string($headers)) + $headers = array_map('trim',explode("\n",$headers)); + } + // si $corps est une chaine -> compat avec la fonction native SPIP + // gerer le cas ou le corps est du html avec un Content-Type: text/html dans les headers + else { + if (preg_match(',Content-Type:\s*text/html,ims',$headers)){ + $message_html = $corps; + } + else { + // Autodetection : tester si le mail est en HTML + if (strpos($headers,"Content-Type:")===false + AND strpos($corps,"<")!==false // eviter les tests suivants si possible + AND $ttrim = trim($corps) + AND substr($ttrim,0,1)=="<" + AND substr($ttrim,-1,1)==">" + AND stripos($ttrim,"")!==false){ + + if(!strlen($sujet)){ + // dans ce cas on ruse un peu : extraire le sujet du title + if (preg_match(",(.*),Uims",$corps,$m)) + $sujet = $m[1]; + else { + // fallback, on prend le body si on le trouve + if (preg_match(",]*>(.*),Uims",$corps,$m)) + $ttrim = $m[1]; + + // et on extrait la premiere ligne de vrai texte... + // nettoyer le html et les retours chariots + $ttrim = textebrut($ttrim); + $ttrim = str_replace("\r\n", "\r", $ttrim); + $ttrim = str_replace("\r", "\n", $ttrim); + // decouper + $ttrim = explode("\n",trim($ttrim)); + // extraire la premiere ligne de texte brut + $sujet = array_shift($ttrim); + } + } + $message_html = $corps; + } + // c'est vraiment un message texte + else + $message_texte = nettoyer_caracteres_mail($corps); + } + $headers = array_map('trim',explode("\n",$headers)); + } + $sujet = nettoyer_titre_email($sujet); + + // si le mail est en texte brut, on l'encapsule dans un modele surchargeable + // pour garder le texte brut, il suffit de faire un modele qui renvoie uniquement #ENV*{texte} + if ($message_texte AND ! $message_html){ + $message_html = recuperer_fond("emails/texte",array('texte'=>$message_texte,'sujet'=>$sujet)); + } + // si le mail est en HTML sans alternative, la generer + if ($message_html AND !$message_texte){ + $message_texte = facteur_mail_html2text($message_html); + } + + // mode TEST : forcer l'email + if (defined('_TEST_EMAIL_DEST')) { + if (!_TEST_EMAIL_DEST) + return false; + else + $destinataire = _TEST_EMAIL_DEST; + } + + // plusieurs destinataires peuvent etre fournis separes par des virgules + // c'est un format standard dans l'envoi de mail + // les passer au format array pour phpMailer + // mais ne pas casser si on a deja un array en entree + if (is_array($destinataire)) + $destinataire = implode(", ",$destinataire); + $destinataire = array_map('trim',explode(",",$destinataire)); + + // On crée l'objet Facteur (PHPMailer) pour le manipuler ensuite + $facteur = new Facteur($destinataire, $sujet, $message_html, $message_texte); + + // On ajoute le courriel de l'envoyeur s'il est fournit par la fonction + if (empty($from) AND empty($facteur->From)) { + $from = $GLOBALS['meta']["email_envoi"]; + if (empty($from) OR !email_valide($from)) { + spip_log("Meta email_envoi invalide. Le mail sera probablement vu comme spam."); + $from = $destinataire; + } + } + + // "Marie Toto " + if (preg_match(",^([^<>\"]*)<([^<>\"]+)>$,i",$from,$m)){ + $nom_envoyeur = trim($m[1]); + $from = trim($m[2]); + } + if (!empty($from)){ + $facteur->From = $from; + // la valeur par défaut de la config n'est probablement pas valable pour ce mail, + // on l'écrase pour cet envoi + $facteur->FromName = $from; + } + + // On ajoute le nom de l'envoyeur s'il fait partie des options + if ($nom_envoyeur) + $facteur->FromName = $nom_envoyeur; + + // Si plusieurs emails dans le from, pas de Name ! + if (strpos($facteur->From,",")!==false){ + $facteur->FromName = ""; + } + + // S'il y a des copies à envoyer + if ($cc){ + if (is_array($cc)) + foreach ($cc as $courriel) + $facteur->AddCC($courriel); + else + $facteur->AddCC($cc); + } + + // S'il y a des copies cachées à envoyer + if ($bcc){ + if (is_array($bcc)) + foreach ($bcc as $courriel) + $facteur->AddBCC($courriel); + else + $facteur->AddBCC($bcc); + } + + // S'il y a des copies cachées à envoyer + if ($repondre_a){ + if (is_array($repondre_a)) + foreach ($repondre_a as $courriel) + $facteur->AddReplyTo($courriel); + else + $facteur->AddReplyTo($repondre_a); + } + + // S'il y a des pièces jointes on les ajoute proprement + if (count($pieces_jointes)) { + foreach ($pieces_jointes as $piece) { + $facteur->AddAttachment( + $piece['chemin'], + isset($piece['nom']) ? $piece['nom']:'', + (isset($piece['encodage']) AND in_array($piece['encodage'],array('base64', '7bit', '8bit', 'binary', 'quoted-printable'))) ? $piece['encodage']:'base64', + isset($piece['mime']) ? $piece['mime']:Facteur::_mime_types(pathinfo($piece['chemin'], PATHINFO_EXTENSION)) + ); + } + } + + // Si une adresse email a été spécifiée pour les retours en erreur, on l'ajoute + if (!empty($adresse_erreur)) + $facteur->Sender = $adresse_erreur; + + // si entetes personalises : les ajouter + // bug : semble ecraser les autres headers. A debug si on veut le rendre fonctionnel + //if (!empty($headers)) { + // foreach($headers as $h) + // $facteur->AddCustomHeader($h); + //} + + // On passe dans un pipeline pour modifier tout le facteur avant l'envoi + $facteur = pipeline('facteur_pre_envoi', $facteur); + + // On génère les headers + $head = $facteur->CreateHeader(); + + // Et c'est parti on envoie enfin + spip_log("mail via facteur\n$head"."Destinataire:".print_r($destinataire,true),'mail'); + spip_log("mail\n$head"."Destinataire:".print_r($destinataire,true),'facteur'); + $retour = $facteur->Send(); + + if (!$retour) + spip_log("Erreur Envoi mail via Facteur : ".print_r($facteur->ErrorInfo,true),'facteur'); + + return $retour ; +} + +?>