/**
 * 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/');
    }
}
Exemple #2
0
/**
 * 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);
    }
}
Exemple #3
0
/**
 * 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);
	}

}
Exemple #4
0
/**
 * 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);
	}
}