function preparer_diff($texte) { include_spip('inc/charsets'); $charset = $GLOBALS['meta']['charset']; if ($charset == 'utf-8') { return unicode_to_utf_8(html2unicode($texte)); } return unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true))); }
function convert_extra($v, $charset_source) { if ($extra = @unserialize($v)) { foreach ($extra as $key=>$val) $extra[$key] = unicode_to_utf_8( charset2unicode($val, $charset_source)); return ", extra=".sql_quote(serialize($extra)); } }
function translitteration($texte, $charset='AUTO', $complexe='') { // 0. Supprimer les caracteres illegaux include_spip('inc/filtres'); $texte = corriger_caracteres($texte); // 1. Passer le charset et les é en utf-8 $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true))); return translitteration_rapide($texte,$charset,$complexe); }
function lignes_longues($texte, $l = 70, $espace='­') { if ($l<1) return $texte; if (!preg_match("/[\w,\/.]{".$l."}/UmsS", $texte)) return $texte; // Passer en utf-8 pour ne pas avoir de coupes trop courtes avec les &#xxxx; // qui prennent 7 caracteres #include_spip('inc/charsets'); $texte = str_replace(" ","< >",$texte); $texte = html2unicode($texte, true); $texte = str_replace("< >"," ",$texte); $texte = unicode_to_utf_8(charset2unicode( $texte, $GLOBALS['meta']['charset'], true)); // echapper les tags (on ne veut pas casser les a href=...) $tags = array(); if (preg_match_all('/<.+>|&(?:amp;)?#x?[0-9]+;|&(?:amp;)?[a-zA-Z1-4]{2,6};/UumsS', $texte, $t, PREG_SET_ORDER)) { foreach ($t as $n => $tag) { $tags[$n] = $tag[0]; $texte = str_replace($tag[0], "<---$n--->", $texte); } } // casser les mots longs qui restent // note : on pourrait preferer couper sur les / , etc. if (preg_match_all("/[\w,\/.]{".$l."}/UmsS", $texte, $longs, PREG_SET_ORDER)) { foreach ($longs as $long) { $texte = str_replace($long[0], $long[0].$espace, $texte); } } // retablir les tags if (preg_match_all('/<---[\s0-9]+--->/UumsS', $texte, $t, PREG_SET_ORDER)) { foreach ($t as $tag) { $n = intval(preg_replace(',[^0-9]+,U','',$tag[0])); $texte = str_replace($tag[0], $tags[$n], $texte); } } return importer_charset($texte, 'utf-8'); }
function translitteration($texte, $charset = 'AUTO', $complexe = '') { static $trans; if ($charset == 'AUTO') { $charset = read_meta('charset'); } $charset = strtolower($charset); $table_translit = 'translit' . $complexe; // 1. Passer le charset et les é en utf-8 $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true))); // 2. Translitterer grace a la table predefinie if (!$trans[$complexe]) { global $CHARSET; load_charset($table_translit); reset($CHARSET[$table_translit]); while (list($key, $val) = each($CHARSET[$table_translit])) { $trans[$complexe][caractere_utf_8($key)] = $val; } } if ($GLOBALS['flag_strtr2']) { $texte = strtr($texte, $trans[$complexe]); } else { $tr = $trans[$complexe]; while (list($from, $to) = each($tr)) { $texte = str_replace($from, $to, $texte); } } /* // Le probleme d'iconv c'est qu'il risque de nous renvoyer des ? alors qu'on // prefere garder l'utf-8 pour que la chaine soit indexable. // 3. Translitterer grace a iconv if ($GLOBALS['flag_iconv'] && preg_match('/�*([0-9]+);/', $texte)) { $texte = iconv('utf-8', 'ascii//translit', $texte); } */ return $texte; }
/** * @param $email * @param $objet * @param $message_html * @param $message_texte * @param array $options * */ public function __construct($email, $objet, $message_html, $message_texte, $options = array()) { // On récupère toutes les options par défaut depuis le formulaire de config $defaut = array(); foreach (array( 'adresse_envoi', 'adresse_envoi_email', 'adresse_envoi_nom', 'forcer_from', 'cc', 'bcc', 'smtp', 'smtp_host', 'smtp_port', 'smtp_auth', 'smtp_username', 'smtp_password', 'smtp_secure', 'smtp_sender', 'filtre_images', 'filtre_iso_8859', ) as $config) { $defaut[$config] = isset($GLOBALS['meta']["facteur_$config"]) ? $GLOBALS['meta']["facteur_$config"] : ''; } // On fusionne les options avec d'éventuelles surcharges lors de l'appel $options = array_merge($defaut, $options); // par defaut on log rien car tres verbeux // on utilise facteur_log_debug qui filtre log SPIP en _LOG_DEBUG $this->SMTPDebug = 0; $this->Debugoutput = "facteur_log_debug"; // Il est possible d'avoir beaucoup plus de logs avec 2, 3 ou 4, ce qui logs les échanges complets avec le serveur // utiliser avec un define('_MAX_LOG',1000); car sinon on est limite a 100 lignes par hit et phpMailer est tres verbeux if (defined('_FACTEUR_DEBUG_SMTP')) { $this->SMTPDebug = _FACTEUR_DEBUG_SMTP ; } $this->exceptions = false; if ( $options['adresse_envoi'] == 'oui' and $options['adresse_envoi_email'] ) { $this->From = $options['adresse_envoi_email']; } else { $this->From = (isset($GLOBALS['meta']["email_envoi"]) AND $GLOBALS['meta']["email_envoi"]) ? $GLOBALS['meta']["email_envoi"] : $GLOBALS['meta']['email_webmaster']; } // Si plusieurs emails dans le from, pas de Name ! if (strpos($this->From,",") === false) { if ( $options['adresse_envoi'] == 'oui' and $options['adresse_envoi_nom'] ) { $this->FromName = $options['adresse_envoi_nom']; } // Par défaut, l'envoyeur est le nom du site else { $this->FromName = strip_tags(extraire_multi($GLOBALS['meta']['nom_site'])); } } // si forcer_from, on sauvegarde le From et FromName par defaut, qui seront utilises // si From n'est pas dans le meme domaine // (utiliser le facteur avec un service externe qui necessite la validation des domaines d'envoi) if ($options['forcer_from']=='oui'){ $this->ForceFrom = $this->From; $this->ForceFromName = $this->FromName; } $this->CharSet = "utf-8"; $this->Mailer = 'mail'; $this->Subject = unicode_to_utf_8(charset2unicode($objet,$GLOBALS['meta']['charset'])); //Pour un envoi multiple de mail, $email doit être un tableau avec les adresses. if (is_array($email)) { foreach ($email as $cle => $adresseMail) { if (!$this->AddAddress($adresseMail)) { spip_log("Erreur AddAddress $adresseMail : ".print_r($this->ErrorInfo, true), 'facteur.'._LOG_ERREUR); } } } elseif (!$this->AddAddress($email)) { spip_log("Erreur AddAddress $email : ".print_r($this->ErrorInfo, true), 'facteur.'._LOG_ERREUR); } // Retour des erreurs if (!empty($options['smtp_sender'])) { $this->Sender = $options['smtp_sender']; $this->AddCustomHeader("Errors-To: ".$this->Sender); } // Destinataires en copie, seulement s'il n'y a pas de destinataire de test if (!defined('_TEST_EMAIL_DEST')){ if (!empty($options['cc'])) { $this->AddCC($options['cc']); } if (!empty($options['bcc'])) { $this->AddBCC($options['bcc']); } } // Si on envoie avec un SMTP explicite if (isset($options['smtp']) AND $options['smtp'] == 'oui') { $this->Mailer = 'smtp'; $this->Host = $options['smtp_host']; $this->Port = $options['smtp_port']; // SMTP authentifié if ($options['smtp_auth'] == 'oui') { $this->SMTPAuth = true; $this->Username = $options['smtp_username']; $this->Password = $options['smtp_password']; } else { $this->SMTPAuth = false; } if ($options['smtp_secure'] == 'ssl') { $this->SMTPSecure = 'ssl'; } if ($options['smtp_secure'] == 'tls') { $this->SMTPSecure = 'tls'; } // Pour le moment on remet l'ancien fonctionnement : // on ne doit pas tester les certificats si pas demandé explicitement avec l'option TLS ! $this->SMTPAutoTLS = false; } // S'il y a un contenu HTML if (!empty($message_html)) { $message_html = unicode_to_utf_8(charset2unicode($message_html, $GLOBALS['meta']['charset'])); $this->Body = $message_html; $this->IsHTML(true); if ($options['filtre_images']) { $this->JoindreImagesHTML(); } $this->UrlsAbsolues(); } // S'il y a un contenu texte brut if (!empty($message_texte)) { $message_texte = unicode_to_utf_8(charset2unicode($message_texte, $GLOBALS['meta']['charset'])); // Si pas de HTML on le remplace en tant que contenu principal if (!$this->Body) { $this->IsHTML(false); $this->Body = $message_texte; } // Sinon on met le texte brut en contenu alternatif else { $this->AltBody = $message_texte; } } if ($options['filtre_iso_8859']) { $this->ConvertirUtf8VersIso8859(); } }