X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fenvoyer_mail.php;h=29be1b363c025fcd5e8d20eedf1b78d8f97ae8d8;hb=4f443dce95ff6f8221c189880a70c74ce1c1f238;hp=187eab53291a0ff79549d8c4838d7f8408de037c;hpb=4a628e9b277d3617535f99d663ca79fa2e891177;p=lhc%2Fweb%2Fwww.git diff --git a/www/ecrire/inc/envoyer_mail.php b/www/ecrire/inc/envoyer_mail.php index 187eab53..29be1b36 100644 --- a/www/ecrire/inc/envoyer_mail.php +++ b/www/ecrire/inc/envoyer_mail.php @@ -3,103 +3,139 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2016 * + * Copyright (c) 2001-2017 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +/** + * Gestion des emails et de leur envoi + * + * @package SPIP\Core\Mail + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); include_spip('inc/texte'); -// http://doc.spip.org/@nettoyer_titre_email +/** + * Nettoyer le titre d'un email + * + * @uses textebrut() + * @uses corriger_typo() + * + * @param string $titre + * @return string + */ function nettoyer_titre_email($titre) { return str_replace("\n", ' ', textebrut(corriger_typo($titre))); } -// http://doc.spip.org/@nettoyer_caracteres_mail +/** + * Utiliser le bon encodage de caractères selon le charset + * + * Caractères pris en compte : apostrophe, double guillemet, + * le tiret cadratin, le tiret demi-cadratin + * + * @uses filtrer_entites() + * + * @param string $t + * @return string + */ function nettoyer_caracteres_mail($t) { $t = filtrer_entites($t); if ($GLOBALS['meta']['charset'] <> 'utf-8') { $t = str_replace( - array("’","“","”"), - array("'", '"', '"'), - $t); + array('’', '“', '”'), + array("'", '"', '"'), + $t + ); } $t = str_replace( - array("—", "&endash;"), - array("--","-" ), - $t); + array('—', '&endash;'), + array('--', '-'), + $t + ); return $t; } /** * Envoi d'un mail - * http://doc.spip.org/@inc_envoyer_mail_dist * * @param string $destinataire * @param string $sujet * @param string|array $corps - * au format string, c'est un corps d'email au format texte, comme supporte nativement par le core - * au format array, c'est un corps etendu qui peut contenir - * string texte : le corps d'email au format texte - * string from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) - * array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete - * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- - * --- chargee de convertir en texte encodee les pieces jointes --- - * array pieces_jointes : listes de pieces a embarquer dans l'email, chacune au format array : - * string chemin : chemin file system pour trouver le fichier a embarquer - * string nom : nom du document tel qu'apparaissant dans l'email - * string encodage : encodage a utiliser, parmi 'base64', '7bit', '8bit', 'binary', 'quoted-printable' - * string mime : mime type du document - * --- Non implemente ici --- - * string html : le corps d'email au format html - * string nom_envoyeur : un nom d'envoyeur pour completer l'email from - * string cc : destinataires en copie conforme - * string bcc : destinataires en copie conforme cachee - * string adresse_erreur : addresse de retour en cas d'erreur d'envoi + * - au format string, c'est un corps d'email au format texte, comme supporte nativement par le core + * - au format array, c'est un corps etendu qui peut contenir + * - string texte : le corps d'email au format texte + * - string from : email de l'envoyeur (prioritaire sur argument $from de premier niveau, deprecie) + * - array headers : tableau d'en-tetes personalises, une entree par ligne d'en-tete + * --- Support partiel par une fonction mail_embarquer_pieces_jointes a fournir, --- + * --- chargee de convertir en texte encodee les pieces jointes --- + * - array pieces_jointes : listes de pieces a embarquer dans l'email, chacune au format array : + * - string chemin : chemin file system pour trouver le fichier a embarquer + * - string nom : nom du document tel qu'apparaissant dans l'email + * - string encodage : encodage a utiliser, parmi 'base64', '7bit', '8bit', 'binary', 'quoted-printable' + * - string mime : mime type du document + * --- Non implemente ici --- + * - string html : le corps d'email au format html + * - string nom_envoyeur : un nom d'envoyeur pour completer l'email from + * - string cc : destinataires en copie conforme + * - string bcc : destinataires en copie conforme cachee + * - string adresse_erreur : addresse de retour en cas d'erreur d'envoi * @param string $from (deprecie, utiliser l'entree from de $corps) * @param string $headers (deprecie, utiliser l'entree headers de $corps) * @return bool */ -function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $headers = "") { +function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = '', $headers = '') { - if (!email_valide($destinataire)) return false; - if ($destinataire == _T('info_mail_fournisseur')) return false; // tres fort + if (!email_valide($destinataire)) { + return false; + } + if ($destinataire == _T('info_mail_fournisseur')) { + return false; + } // tres fort // Fournir si possible un Message-Id: conforme au RFC1036, // sinon SpamAssassin denoncera un MSGID_FROM_MTA_HEADER - $email_envoi = $GLOBALS['meta']["email_envoi"]; + $email_envoi = $GLOBALS['meta']['email_envoi']; if (!email_valide($email_envoi)) { - spip_log("Meta email_envoi invalide. Le mail sera probablement vu comme spam."); + spip_log('Meta email_envoi invalide. Le mail sera probablement vu comme spam.'); $email_envoi = $destinataire; } - if (is_array($corps)){ + $parts = ''; + if (is_array($corps)) { $texte = $corps['texte']; - $from = (isset($corps['from'])?$corps['from']:$from); - $headers = (isset($corps['headers'])?$corps['headers']:$headers); - if (is_array($headers)) - $headers = implode("\n",$headers); - $parts = ""; - if ($corps['pieces_jointes'] AND function_exists('mail_embarquer_pieces_jointes')) + $from = (isset($corps['from']) ? $corps['from'] : $from); + $headers = (isset($corps['headers']) ? $corps['headers'] : $headers); + if (is_array($headers)) { + $headers = implode("\n", $headers); + } + if ($corps['pieces_jointes'] and function_exists('mail_embarquer_pieces_jointes')) { $parts = mail_embarquer_pieces_jointes($corps['pieces_jointes']); - } else + } + } else { $texte = $corps; + } - if (!$from) $from = $email_envoi; + if (!$from) { + $from = $email_envoi; + } // ceci est la RegExp NO_REAL_NAME faisant hurler SpamAssassin - if (preg_match('/^["\s]*\?\s*$/', $from)) - $from .= ' (' . str_replace(')','', translitteration(str_replace('@', ' at ', $from))) . ')'; + if (preg_match('/^["\s]*\?\s*$/', $from)) { + $from .= ' (' . str_replace(')', '', translitteration(str_replace('@', ' at ', $from))) . ')'; + } // nettoyer les é ’, &emdash; etc... // les 'cliquer ici' etc sont a eviter; voir: @@ -117,23 +153,24 @@ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $heade mb_internal_encoding('utf-8'); } - if (function_exists('wordwrap') && (preg_match(',multipart/mixed,',$headers) == 0)) + if (function_exists('wordwrap') && (preg_match(',multipart/mixed,', $headers) == 0)) { $texte = wordwrap($texte); + } list($headers, $texte) = mail_normaliser_headers($headers, $from, $destinataire, $texte, $parts); if (_OS_SERVEUR == 'windows') { - $texte = preg_replace ("@\r*\n@","\r\n", $texte); - $headers = preg_replace ("@\r*\n@","\r\n", $headers); - $sujet = preg_replace ("@\r*\n@","\r\n", $sujet); + $texte = preg_replace("@\r*\n@", "\r\n", $texte); + $headers = preg_replace("@\r*\n@", "\r\n", $headers); + $sujet = preg_replace("@\r*\n@", "\r\n", $sujet); } - spip_log("mail $destinataire\n$sujet\n$headers",'mails'); + spip_log("mail $destinataire\n$sujet\n$headers", 'mails'); // mode TEST : forcer l'email if (defined('_TEST_EMAIL_DEST')) { - if (!_TEST_EMAIL_DEST) + if (!_TEST_EMAIL_DEST) { return false; - else { + } else { $texte = "Dest : $destinataire\r\n" . $texte; $destinataire = _TEST_EMAIL_DEST; } @@ -142,16 +179,27 @@ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $heade return @mail($destinataire, $sujet, $texte, $headers); } -function mail_normaliser_headers($headers, $from, $to, $texte, $parts="") -{ +/** + * Formater correctement l'entête d'un email + * + * @param string $headers + * @param string $from + * @param string $to + * @param string $texte + * @param string $parts + * @return array + */ +function mail_normaliser_headers($headers, $from, $to, $texte, $parts = '') { $charset = $GLOBALS['meta']['charset']; // Ajouter le Content-Type et consort s'il n'y est pas deja - if (strpos($headers, "Content-Type: ") === false) + if (strpos($headers, 'Content-Type: ') === false) { $type = - "Content-Type: text/plain;charset=\"$charset\";\n". - "Content-Transfer-Encoding: 8bit\n"; - else $type = ''; + "Content-Type: text/plain;charset=\"$charset\";\n" . + "Content-Transfer-Encoding: 8bit\n"; + } else { + $type = ''; + } // calculer un identifiant unique preg_match('/@\S+/', $from, $domain); @@ -159,7 +207,7 @@ function mail_normaliser_headers($headers, $from, $to, $texte, $parts="") // Si multi-part, s'en servir comme borne ... if ($parts) { - $texte = "--$uniq\n$type\n" . $texte ."\n"; + $texte = "--$uniq\n$type\n" . $texte . "\n"; foreach ($parts as $part) { $n = strlen($part[1]) . ($part[0] ? "\n" : ''); $e = join("\n", $part[0]); @@ -173,20 +221,21 @@ function mail_normaliser_headers($headers, $from, $to, $texte, $parts="") // .. et s'en servir pour plaire a SpamAssassin - $mid = 'Message-Id: <' . $uniq . ">"; + $mid = 'Message-Id: <' . $uniq . '>'; // indispensable pour les sites qui collent d'office From: serveur-http // sauf si deja mis par l'envoyeur - $rep = (strpos($headers,"Reply-To:")!==FALSE) ? '' : "Reply-To: $from\n"; + $rep = (strpos($headers, 'Reply-To:') !== false) ? '' : "Reply-To: $from\n"; // Nettoyer les en-tetes envoyees // Ajouter le \n final - if (strlen($headers = trim($headers))) $headers .= "\n"; + if (strlen($headers = trim($headers))) { + $headers .= "\n"; + } - // Et mentionner l'indeboulonable nomenclature ratee + // Et mentionner l'indeboulonable nomenclature ratee $headers .= "From: $from\n$type$rep$mid\nMIME-Version: 1.0\n"; return array($headers, $texte); } -?>