/** * Envoyer un email de notification * * Le sujet peut être vide, dans ce cas il reprendra la première ligne non vide du texte * * @param array|string $emails * @param string $texte * @param string $sujet * @param string $from * @param string $headers */ function notifications_envoyer_mails($emails, $texte, $sujet = "", $from = "", $headers = "") { // rien a faire si pas de texte ! if (!strlen($texte)) { return; } // si on ne specifie qu'un email, le mettre dans un tableau if (!is_array($emails)) { $emails = explode(',', $emails); } notifications_nettoyer_emails($emails); // tester si le mail est deja en html if (strpos($texte, "<") !== false and $ttrim = trim($texte) and substr($ttrim, 0, 1) == "<" and substr($ttrim, -1, 1) == ">" and stripos($ttrim, "</html>") !== false) { if (!strlen($sujet)) { // dans ce cas on ruse un peu : extraire le sujet du title if (preg_match(",<title>(.*)</title>,Uims", $texte, $m)) { $sujet = $m[1]; } else { // fallback, on prend le body si on le trouve if (preg_match(",<body[^>]*>(.*)</body>,Uims", $texte, $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); } } // si besoin on ajoute le content-type dans les headers if (stripos($headers, "Content-Type") === false) { $headers .= "Content-Type: text/html\n"; } } // si le sujet est vide, extraire la premiere ligne du corps // du mail qui est donc du texte if (!strlen($sujet)) { // nettoyer un peu les retours chariots $texte = str_replace("\r\n", "\r", $texte); $texte = str_replace("\r", "\n", $texte); // decouper $texte = explode("\n", trim($texte)); // extraire la premiere ligne $sujet = array_shift($texte); $texte = trim(implode("\n", $texte)); } $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); foreach ($emails as $email) { // passer dans un pipeline qui permet un ajout eventuel // (url de suivi des notifications par exemple) $envoi = pipeline('notifications_envoyer_mails', array('email' => $email, 'sujet' => $sujet, 'texte' => $texte)); $email = $envoi['email']; job_queue_add('envoyer_mail', ">{$email} : " . $envoi['sujet'], array($email, $envoi['sujet'], $envoi['texte'], $from, $headers), 'inc/'); } }
/** * cette notification s'execute quand on valide un message 'prop'ose, * dans ecrire/inc/forum_insert.php ; ici on va notifier ceux qui ne l'ont * pas ete a la notification forumposte (sachant que les deux peuvent se * suivre si le forum est valide directement ('pos' ou 'abo') * http://doc.spip.org/@notifications_forumvalide_dist * * @param string $quoi * @param int $id_forum */ function notifications_forumvalide_dist($quoi, $id_forum, $options) { $t = sql_fetsel("*", "spip_forum", "id_forum=" . intval($id_forum)); if (!$t or @$t['statut'] == 'perso') { return; } // plugin notification si present $prevenir_auteurs = isset($GLOBALS['notifications']['prevenir_auteurs']) and $GLOBALS['notifications']['prevenir_auteurs']; // sinon voie normale if ($t['objet'] == 'article' and !$prevenir_auteurs) { $s = sql_getfetsel('accepter_forum', 'spip_articles', "id_article=" . $t['id_objet']); if (!$s) { $s = substr($GLOBALS['meta']["forums_publics"], 0, 3); } $prevenir_auteurs = (strpos(@$GLOBALS['meta']['prevenir_auteurs'], ",{$s},") !== false or @$GLOBALS['meta']['prevenir_auteurs'] === 'oui'); // compat } include_spip('inc/texte'); include_spip('inc/filtres'); include_spip('inc/autoriser'); // Qui va-t-on prevenir ? $tous = array(); // Ne pas ecrire au posteur du message, ni au moderateur qui valide le forum, $pasmoi = array($t['email_auteur'], $GLOBALS['visiteur_session']['email']); // 1. Les auteurs de l'objet lie au forum // seulement ceux qui n'ont // pas le droit de le moderer (les autres l'ont recu plus tot) if ($prevenir_auteurs) { $result = sql_select("auteurs.*", "spip_auteurs AS auteurs, spip_auteurs_liens AS lien", "lien.objet=" . sql_quote($t['objet']) . " AND lien.id_objet=" . intval($t['id_objet']) . " AND auteurs.id_auteur=lien.id_auteur"); while ($qui = sql_fetch($result)) { if ($qui['email']) { if (!autoriser('modererforum', $t['objet'], $t['id_objet'], $qui['id_auteur'])) { $tous[] = $qui['email']; } else { // Ne pas ecrire aux auteurs deja notifies precedemment $pasmoi[] = $qui['email']; } } } } $options['forum'] = $t; $destinataires = pipeline('notifications_destinataires', array('args' => array('quoi' => $quoi, 'id' => $id_forum, 'options' => $options), 'data' => $tous)); // Nettoyer le tableau // en enlevant les exclus notifications_nettoyer_emails($destinataires, $pasmoi); // // Envoyer les emails // $email_notification_forum = charger_fonction('email_notification_forum', 'inc'); foreach ($destinataires as $email) { $texte = $email_notification_forum($t, $email); notifications_envoyer_mails($email, $texte); } }
/** * Envoyer un email de notification * Le sujet peut etre vide, dans ce cas il reprendra la premiere ligne non vide du texte * * @param array/string $emails * @param string $texte * @param string $sujet */ function notifications_envoyer_mails($emails,$texte,$sujet=""){ // rien a faire si pas de texte ! if (!strlen($texte)) return; // si on ne specifie qu'un email, le mettre dans un tableau if (!is_array($emails)) $emails = explode(',',$emails); notifications_nettoyer_emails($emails); // si le sujet est vide, extraire la premiere ligne du corps if (!strlen($sujet)){ // nettoyer un peu les retours chariots $texte = str_replace("\r\n", "\r", $texte); $texte = str_replace("\r", "\n", $texte); // decouper $texte = explode("\n",trim($texte)); // extraire la premiere ligne $sujet = array_shift($texte); $texte = trim(implode("\n",$texte)); } $envoyer_mail = charger_fonction('envoyer_mail','inc'); foreach($emails as $email){ // passer dans un pipeline qui permet un ajout eventuel // (url de suivi des notifications par exemple) $envoi = pipeline('notifications_envoyer_mails',array('email'=>$email,'sujet'=>$sujet,'texte'=>$texte)); $email = $envoi['email']; $sujet = $envoi['sujet']; $texte = $envoi['texte']; if (function_exists('job_queue_add')) job_queue_add('envoyer_mail', ">$email : $sujet", array($email, $sujet, $texte), 'inc/'); else $envoyer_mail($email, $sujet, $texte); } }
/** * cette notification s'execute quand un message est poste, * * @param string $quoi * @param int $id_forum */ function notifications_forumposte_dist($quoi, $id_forum, $options) { $t = sql_fetsel("*", "spip_forum", "id_forum=".intval($id_forum)); if (!$t) return; // plugin notification si present $prevenir_auteurs = isset($GLOBALS['notifications']['prevenir_auteurs']) AND $GLOBALS['notifications']['prevenir_auteurs']; // sinon voie normale if ($t['id_article'] AND !$prevenir_auteurs){ $s = sql_getfetsel('accepter_forum','spip_articles',"id_article=" . $t['id_article']); if (!$s) $s = substr($GLOBALS['meta']["forums_publics"],0,3); $prevenir_auteurs = (strpos(@$GLOBALS['meta']['prevenir_auteurs'],",$s,")!==false OR @$GLOBALS['meta']['prevenir_auteurs'] === 'oui'); // compat } include_spip('inc/texte'); include_spip('inc/filtres'); include_spip('inc/autoriser'); // Qui va-t-on prevenir ? $tous = array(); // 1. Les auteurs de l'article (si c'est un article), mais // seulement s'ils ont le droit de le moderer (les autres seront // avertis par la notifications_forumvalide). if ($t['id_article'] AND $prevenir_auteurs) { $result = sql_select("auteurs.*","spip_auteurs AS auteurs, spip_auteurs_articles AS lien","lien.id_article=".intval($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur"); while ($qui = sql_fetch($result)) { if ($qui['email'] AND autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur'])) $tous[] = $qui['email']; } } $options['forum'] = $t; $destinataires = pipeline('notifications_destinataires', array( 'args'=>array('quoi'=>$quoi,'id'=>$id_forum,'options'=>$options) , 'data'=>$tous) ); // Nettoyer le tableau // Ne pas ecrire au posteur du message ! notifications_nettoyer_emails($destinataires,array($t['email_auteur'])); // // Envoyer les emails // foreach ($destinataires as $email) { $texte = email_notification_forum($t, $email); notifications_envoyer_mails($email, $texte); } // Notifier les autres si le forum est valide // est-ce que cet appel devrait bien etre la ? if ($t['statut'] == 'publie') { $notifications = charger_fonction('notifications', 'inc'); $notifications('forumvalide', $id_forum); } }