Changeset 112809 in spip-zone


Ignore:
Timestamp:
Dec 14, 2018, 3:05:03 PM (5 weeks ago)
Author:
root
Message:

Ajout d'une option graceful sur les envois qui evite d'envoyer la meme newsletter a un email qui l'a deja recue
Cela s'accompagne d'une option dans le formulaire d'envoi, sur les newsletters, decochee par defaut : [ ] Envoyer à nouveau aux destinataires qui l'ont déjà reçue
(par defaut donc, desormais, on n'envoie plus en double)
Techniquement il y a un champ graceful en base sur les mailshots.
Par contre quand on construit la liste des destinataires on enumere bien tous les destinataires comme avant, mais simplement pour chaque envoi on verifie d'abord si cet email a deja recu la newsletter et si oui on recupere directement le statut et la date du dernier envoi sans rien faire
(le destinataire apparait donc bien dans la liste, en sent ou read ou open, avec la date de l'envoi precedent)
A priori ca doit marcher, mais je n'ai pas encore teste en live

Location:
_plugins_/mailshot/trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/mailshot/trunk/base/mailshot.php

    r100314 r112809  
    4040                        "texte" => "longtext NOT NULL DEFAULT ''",
    4141                        "listes" => "text NOT NULL DEFAULT ''",
     42                        "graceful"   => "tinyint(1) NOT NULL DEFAULT 0",
    4243                        "from_name" => "text NOT NULL DEFAULT ''",
    4344                        "from_email" => "text NOT NULL DEFAULT ''",
  • _plugins_/mailshot/trunk/formulaires/newsletter_send.html

    r100502 r112809  
    3434                                        <input type="submit" name="envoi" class="submit" value="<:newsletter:bouton_envoyer:>" name="test" />
    3535                                </li>
     36                                #SET{name,resend}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
     37                                <li class="editer pleine_largeur editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">[
     38                                        <span class='erreur_message'>(#GET{erreurs})</span>
     39                                        ]<div class="choix">
     40                                                #SET{val,non}
     41                                                <input type="hidden" name="#GET{name}" value="#GET{val}" />
     42                                                #SET{val,oui}
     43                                                <input type="checkbox" name="#GET{name}" class="checkbox" id="#GET{name}_#GET{val}" value="#GET{val}"[(#ENV{#GET{name},#GET{defaut}}|=={#GET{val}}|oui)checked="checked"] />
     44                                                <label for="#GET{name}_#GET{val}">[(#GET{fl}|concat{':label_',#GET{name},'_',#GET{val}}|_T)]</label>
     45                                        </div>
     46                                </li>
    3647                                #SET{name,date_start}#SET{obli,''}#SET{defaut,''}#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
    3748                                <li class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
  • _plugins_/mailshot/trunk/formulaires/newsletter_send.php

    r109352 r112809  
    1818                'liste' => '',
    1919                'planifie' => '',
     20                'resend' => 'non',
    2021                'date_start_jour' => '',
    2122                'date_start_heure' => '',
     
    123124                        $options['date_start'] = sql_format_date($d[0], $d[1], $d[2], $h[0], $h[1]);
    124125                }
     126                if (_request('resend')!=='oui'){
     127                        $options['graceful'] = true;
     128                }
    125129
    126130                $bulkstart = charger_fonction("bulkstart","newsletter");
  • _plugins_/mailshot/trunk/inc/mailshot.php

    r109686 r112809  
    174174                                if (time()>_MAILSHOT_MAX_TIME) return $nb_restant;
    175175                                $s = $subscriber($d['email'],array('listes'=>$listes));
    176                                 spip_log("mailshot_envoyer_lot #".$shoot['id_mailshot']."/".$d['email']." send","mailshot");
    177                                 $erreur = $send($s, $corps, $options);
    178                                 $try = $d['try']+1;
    179                                 if ($erreur){
    180                                         if ($try>=_MAILSHOT_MAX_TRY
    181                                                 OR preg_match(",@example\.org$,i",$s['email'])
    182                                           OR defined('_TEST_EMAIL_DEST')){
    183                                                 sql_updateq("spip_mailshots_destinataires",array('statut'=>'fail','try'=>$try,'date'=>date('Y-m-d H:i:s')),"id_mailshot=".intval($shoot['id_mailshot'])." AND email=".sql_quote($d['email']));
     176                                $done = false;
     177                                if (!$done = mailshot_verifier_email_envoi_bloque($d['email'], $s, $shoot)) {
     178                                        spip_log("mailshot_envoyer_lot #".$shoot['id_mailshot']."/".$d['email']." send","mailshot");
     179                                        $erreur = $send($s, $corps, $options);
     180                                        $try = $d['try']+1;
     181                                        if ($erreur){
     182                                                if ($try>=_MAILSHOT_MAX_TRY
     183                                                        OR preg_match(",@example\.org$,i",$s['email'])
     184                                                  OR defined('_TEST_EMAIL_DEST')){
     185                                                        $done = array(
     186                                                                'fail' => true,
     187                                                                'statut' => 'fail',
     188                                                                'try' => $try,
     189                                                                'date'=>date('Y-m-d H:i:s'),
     190                                                                'log' => "ERREUR [$erreur] / failed apres $try essais",
     191                                                        );
     192                                                        // si c'est un fail max_try verifier et desinscrire eventuellement
     193                                                        if ($try>1){
     194                                                                mailshot_verifier_email_fail($d['email']);
     195                                                        }
     196                                                }
     197                                                else {
     198                                                        $done = array(
     199                                                                'try' => $try,
     200                                                                'date'=>date('Y-m-d H:i:s'),
     201                                                                'log' => "INFO Probleme [$erreur] (essai $try)",
     202                                                        );
     203                                                }
     204                                        }
     205                                        else {
     206                                                $done = array(
     207                                                        'done' => true,
     208                                                        'statut'=>'sent',
     209                                                        'try'=>$try,
     210                                                        'date'=>date('Y-m-d H:i:s'),
     211                                                        'log' => "OK",
     212                                                );
     213                                        }
     214                                }
     215                                if ($done) {
     216                                        if (isset($done['done'])) {
     217                                                $nb_restant--;
     218                                                unset($done['done']);
     219                                                sql_update("spip_mailshots",array("current"=>"current+1"),"id_mailshot=".intval($shoot['id_mailshot']));
     220                                        }
     221                                        if (isset($done['fail'])) {
     222                                                unset($done['fail']);
    184223                                                sql_update("spip_mailshots",array("current"=>"current+1","failed"=>"failed+1"),"id_mailshot=".intval($shoot['id_mailshot']));
    185                                                 spip_log("mailshot_envoyer_lot #".$shoot['id_mailshot']."/".$d['email']." : Erreur [$erreur] / failed apres $try essais","mailshot"._LOG_ERREUR);
    186                                                 // si c'est un fail max_try verifier et desinscrire eventuellement
    187                                                 if ($try>1){
    188                                                         mailshot_verifier_email_fail($d['email']);
     224                                        }
     225                                        if (isset($done['log'])) {
     226                                                $loglevel = '';
     227                                                if (strncmp($done['log'], 'ERREUR', 6) == 0) {
     228                                                        $loglevel = _LOG_ERREUR;
    189229                                                }
    190                                         }
    191                                         else {
    192                                                 sql_updateq("spip_mailshots_destinataires",array('try'=>$try,'date'=>date('Y-m-d H:i:s')),"id_mailshot=".intval($shoot['id_mailshot'])." AND email=".sql_quote($d['email']));
    193                                                 spip_log("mailshot_envoyer_lot #".$shoot['id_mailshot']."/".$d['email']." : Probleme [$erreur] (essai $try)","mailshot"._LOG_INFO_IMPORTANTE);
    194                                         }
    195                                 }
    196                                 else {
    197                                         $nb_restant--;
    198                                         sql_updateq("spip_mailshots_destinataires",array('statut'=>'sent','try'=>$try,'date'=>date('Y-m-d H:i:s')),"id_mailshot=".intval($shoot['id_mailshot'])." AND email=".sql_quote($d['email']));
    199                                         sql_update("spip_mailshots",array("current"=>"current+1"),"id_mailshot=".intval($shoot['id_mailshot']));
    200                                         spip_log("mailshot_envoyer_lot #".$shoot['id_mailshot']."/".$d['email']." OK","mailshot");
     230                                                elseif (strncmp($done['log'], 'INFO', 4) == 0) {
     231                                                        $loglevel = _LOG_INFO_IMPORTANTE;
     232                                                }
     233                                                spip_log("mailshot_envoyer_lot #".$shoot['id_mailshot']."/".$d['email']." : " . $done['log'], "mailshot" . $loglevel);
     234                                                unset($done['log']);
     235                                        }
     236                                        sql_updateq("spip_mailshots_destinataires", $done,"id_mailshot=".intval($shoot['id_mailshot'])." AND email=".sql_quote($d['email']));
    201237                                }
    202238                                $nb_max--;
     
    223259}
    224260
     261/**
     262 * Verifie avant nouvel envoi un email et bloque un envoi si besoin
     263 *
     264 * @param string $email
     265 * @param array $subscriber
     266 * @param array $shoot
     267 * @return array|bool
     268 */
     269function mailshot_verifier_email_envoi_bloque($email, $subscriber, $shoot) {
     270        static $envois_idem = array();
     271
     272        if (preg_match(",@example\.org$,i",$subscriber['email'])) {
     273                return array(
     274                        'fail' => true,
     275                        'statut' => 'fail',
     276                        'date' => date('Y-m-d H:i:s'),
     277                        'log' => "INFO Envoi BLOQUE Email obfusque ".$subscriber['email']."",
     278                );
     279        }
     280        if (_TEST_EMAIL_DEST) {
     281                $erreur = _T('mailshot:erreur_envoi_mail_force_debug',array('email'=>_TEST_EMAIL_DEST));
     282                return array(
     283                        'fail' => true,
     284                        'statut' => 'fail',
     285                        'date' => date('Y-m-d H:i:s'),
     286                        'log' => "INFO Envoi BLOQUE $erreur",
     287                );
     288        }
     289
     290        if ($shoot['graceful']) {
     291                // trouver tous les envois pour le meme id
     292                if (!isset($envois_idem[$shoot['id_mailshot']])) {
     293                        $idem = sql_allfetsel('id_mailshot', 'spip_mailshots', 'id='.sql_quote($shoot['id'],'','text'));
     294                        $envois_idem[$shoot['id_mailshot']] = array_column($idem, 'id_mailshot');
     295                }
     296                if ($last = sql_fetsel('*', 'spip_mailshots_destinataires',
     297                        array(
     298                                'email=' . sql_quote($email),
     299                                sql_in('statut', array('todo', 'fail'), 'NOT'),
     300                                sql_in('id_mailshot', $envois_idem[$shoot['id_mailshot']]),
     301                        ),'', 'date DESC', '0,1')) {
     302                        // on a trouve un envoi deja fait a la meme newsletter, on passe notre tour pout celui-ci
     303                        $done = array(
     304                                'done' => true,
     305                                'statut' => $last['statut'],
     306                                'date' => $last['date'],
     307                                'log' => "INFO Envoi BLOQUE newsletter #".$shoot['id']." deja envoyee a $email par mailshot#" . $last['id_mailshot'] . " / " . $last['date']
     308                        );
     309                        return $done;
     310                }
     311        }
     312
     313        return false;
     314
     315}
    225316
    226317/**
  • _plugins_/mailshot/trunk/lang/mailshot_fr.php

    r112250 r112809  
    6565        'label_html' => 'Version HTML',
    6666        'label_listes' => 'Listes',
     67        'label_graceful' => 'Uniquement les destinataires qui n\'ont pas déjà reçu ce contenu',
    6768        'label_mailer_defaut' => 'Utiliser le même service d’envoi que pour les autres mails',
    6869        'label_mailer_defaut_desactive' => 'Impossible : aucun service d’envoi d’email n’est configuré',
  • _plugins_/mailshot/trunk/lang/newsletter_fr.php

    r98711 r112809  
    2222        'label_liste' => 'aux abonnés de ',
    2323        'label_date_start' => 'Planifier l\'envoi',
     24        'label_resend_oui' => 'Envoyer à nouveau aux destinataires qui l\'ont déjà reçue',
    2425
    2526);
  • _plugins_/mailshot/trunk/mailshot_administrations.php

    r100314 r112809  
    6060        $maj['0.3.5'] = array(
    6161                array('maj_tables', array('spip_mailshots')),
     62        );
     63        $maj['0.3.6'] = array(
     64                array('maj_tables', array('spip_mailshots')), // option graceful
    6265        );
    6366
  • _plugins_/mailshot/trunk/newsletter/bulkstart.php

    r100511 r112809  
    2323 *   string statut : statut par defaut
    2424 *   string date_start : date de debut d'envoi (dans le futur)
     25 *   bool graceful : ne pas envoyer aux destinataires qui on déjà reçu ce contenu
    2526 * @return int
    2627 *   0 si echec ou id de l'envoi sinon
     
    2930        // TODO : recuperer la limite de rate d'apres la config
    3031        $now = date('Y-m-d H:i:s');
    31         $defaut = array('statut'=>'processing','date_start'=>$now);
     32        $defaut = array('statut'=>'processing','date_start'=>$now, 'graceful'=>0);
    3233        if (isset($options['date_start'])){
    3334                if (strtotime($options['date_start'])>time()) {
     
    7677                'texte' => $corps['texte'],
    7778                'listes' => implode(',',$listes),
     79                'graceful' => $options['graceful'],
    7880                'from_name' => $from_name,
    7981                'from_email' => $from_email,
  • _plugins_/mailshot/trunk/paquet.xml

    r112243 r112809  
    22        prefix="mailshot"
    33        categorie="communication"
    4         version="1.26.1"
     4        version="1.27.0"
    55        etat="stable"
    66        compatibilite="[3.0.5;3.2.*]"
    77        logo="prive/themes/spip/images/mailshot-32.png"
    88        documentation="https://contrib.spip.net/mailshot"
    9         schema="0.3.5"
     9        schema="0.3.6"
    1010>
    1111
  • _plugins_/mailshot/trunk/prive/objets/contenu/mailshot.html

    r100315 r112809  
    1717]
    1818
    19 [<div class="champ contenu_listes[ (#LISTES*|strlen|?{'',vide})]">
     19[[(#BOITE_OUVRIR{#VAL{mailshot:label_listes}|_T|concat{' ',#GRACEFUL|?{<small class="graceful"><:mailshot:label_graceful:></small>}}})]
     20<div class="champ contenu_listes[ (#LISTES*|strlen|?{'',vide})]">
    2021        <div class='label'><:mailshot:label_listes:> : </div>
    2122        <span dir='#LANG_DIR' class='#EDIT{listes} listes'>(#LISTES|mailshot_affiche_nom_liste)</span>
    22 </div>]
     23</div>
     24#BOITE_FERMER
     25]
    2326
    2427<div class="champ contenu_from[ (#FROM_EMAIL*|strlen|?{'',vide})]">
  • _plugins_/mailshot/trunk/prive/style_prive_plugin_mailshot.html

    r98711 r112809  
    1212.formulaire_newsletter_send .editer_liste .submit {float: #ENV{right}}
    1313
     14.formulaire_newsletter_send .editer_resend {padding-top: 0;}
     15.formulaire_newsletter_send .editer_resend .choix {padding: 0;background: none;border:0 !important;}
     16.formulaire_newsletter_send .editer_resend .choix label {margin-left: 0}
     17
    1418.formulaire_newsletter_send .editer_date_start {padding-top:0;}
    1519.formulaire_newsletter_send .editer_date_start label {width: auto}
    16 .formulaire_newsletter_send .editer_date_start label input.checkbox {margin-left:0;}
     20.formulaire_newsletter_send .editer_date_start label input.checkbox {}
    1721
    1822.formulaire_newsletter_send .liste-objets.mailshots {margin:1em 0;}
     
    2226.mailshot #wysiwyg {margin-bottom: 2.0775em;padding:0;}
    2327.mailshot #wysiwyg .label {display: inline;}
     28.mailshot #wysiwyg small.graceful {font-weight: normal}
     29.mailshot #wysiwyg small.graceful::before {content:'(';display: inline}
     30.mailshot #wysiwyg small.graceful::after {content:')';display: inline}
     31
     32.mailshot #wysiwyg .contenu_listes .label {display: none;}
    2433.mailshot #wysiwyg .contenu_avancement,
    2534.mailshot #wysiwyg .contenu_html,
Note: See TracChangeset for help on using the changeset viewer.