Add a panne_level column updated by emails.broken script.
authorx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Tue, 1 Aug 2006 13:12:30 +0000 (13:12 +0000)
committerx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Tue, 1 Aug 2006 13:12:30 +0000 (13:12 +0000)
panne_level is incremented each month the address is broken
panne_level is decremented each month the address is OK
when panne_level >= 3, the address flag is set to 'panne' and so the address becomes deactivated

git-svn-id: svn+ssh://murphy/home/svn/platal/trunk@767 839d8a87-29fc-0310-9880-83ba4fa771e5

bin/cron/emails.check.php
bin/emails.broken.php
htdocs/images/icons/error.gif [new file with mode: 0644]
include/emails.inc.php
templates/admin/utilisateurs.tpl
templates/emails/index.tpl
templates/emails/redirect.tpl
upgrade/0.9.11/07_emails.sql [new file with mode: 0644]

index 3762c7b..81aec17 100755 (executable)
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
+/* Number of consecutive month of bounce before deactivating a redirection
+ */
+$panne_level = 3;
+
 require('./connect.db.inc.php');
 
+/* 
+ * Check duplicated addresses
+ */
 $sql = "SELECT a1.alias, a2.alias, e1.email
           FROM emails        AS e1
     INNER JOIN emails        AS e2 ON (e1.email = e2.email AND e1.uid != e2.uid 
@@ -57,6 +64,33 @@ if (count($conflits) > 0) {
     }
 }
 
+/*
+ * Check dead emails
+ */
+if ($panne_level > 0) {
+    $sql = "SELECT  e.email, a.alias AS forlife
+              FROM  emails  AS e
+        INNER JOIN  aliases AS a ON a.id = e.uid AND a.type = 'a_vie'
+             WHERE  e.panne_level = $panne_level AND e.flags = 'active'
+          ORDER BY  a.alias";
+    $res = Xdb::query($sql);
+
+    if ($res->numRows()) {
+        $result = $res->fetchAllAssoc();
+        echo "Nouvelles adresses en panne détectées :\n";
+        foreach ($result as $assoc) {
+            echo '* ' . $assoc['email'] . ' pour ' . $assoc['forlife'] . "\n";
+        }
+        echo "\n\n";
 
+        Xdb::execute("UPDATE  emails
+                         SET  flags = 'panne'
+                       WHERE  panne_level = 3 AND flags = 'active'");
+    }
+
+    Xdb::execute("UPDATE  emails
+                     SET  panne_level = $panne_level
+                   WHERE  panne_level > $panne_level");
+}
 
 ?>
index 21f6a2b..93155a4 100755 (executable)
  *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
  ***************************************************************************/
 
-ini_set('include_path', '../include:/usr/share/php');
-require_once('../include/xorg.inc.php');
-require_once('../include/emails.inc.php');
+ini_set('include_path', '.:../include:/usr/share/php');
+
+require_once('connect.db.inc.php');
+require_once('xorg.inc.php');
+require_once('emails.inc.php');
 
 $opts = getopt('i:o:');
 if (($opts['i'] && $opts['i'] == '-') || empty($opts['i'])) {
@@ -38,6 +39,7 @@ if (($opts['o'] && $opts['o'] == '-') || empty($opts['o'])) {
 
 $emails = explode("\n", file_get_contents($file));
 $list   = array();
+
 foreach ($emails as $_email) {
     $email = valide_email($_email);
     if (empty($email) || $email=='@') {
@@ -54,7 +56,17 @@ foreach ($emails as $_email) {
            GROUP BY  e1.uid", $email);
     if ($x = $sel->fetchOneAssoc()) {
         if (!$x['panne']) {
-            XDB::execute("UPDATE emails SET panne=NOW() WHERE email = {?}", $email);
+            XDB::execute("UPDATE emails
+                             SET panne=NOW(), last=NOW()
+                                 panne_level = 1
+                           WHERE email = {?}",
+                          $email);
+        } else {
+            XDB::execute("UPDATE emails
+                             SET last = CURDATE(),
+                                 panne_level = panne_level + 1
+                           WHERE email = {?}
+                                 AND DATE_ADD(last, INTERVAL 15 DAY) < CURDATE()", $email);
         }
 
         if (empty($x['nb_mails'])) {
@@ -112,6 +124,11 @@ login ({$x['alias']}) et ta date de naissance !";
     }
 }
 
+XDB::execute("UPDATE emails
+                 SET panne_level = panne_level - 1
+               WHERE flags = 'active' AND panne_level > 1
+                     AND last != CURDATE()");
+
 $csv = "nom;prenom;promo;alias;bounce;nbmails\n";
 foreach ($list as $alias=>$mails) {
     $sel = Xdb::query(
diff --git a/htdocs/images/icons/error.gif b/htdocs/images/icons/error.gif
new file mode 100644 (file)
index 0000000..de6dc7b
Binary files /dev/null and b/htdocs/images/icons/error.gif differ
index 0a7cf14..d1044c9 100644 (file)
@@ -115,15 +115,19 @@ class Email
     
     var $email;
     var $active;
+    var $broken;
     var $rewrite;
     var $panne;
+    var $last;
 
     // }}}
     // {{{ constructor
 
     function Email($row)
     {
-        list($this->email, $this->active, $this->rewrite, $this->panne) = $row;
+        list($this->email, $flags, $this->rewrite, $this->panne, $this->last) = $row;
+        $this->active = ($flags == 'active');
+        $this->broken = ($flags == 'panne');
     }
 
     // }}}
@@ -132,10 +136,13 @@ class Email
     function activate($uid)
     {
         if (!$this->active) {
-            XDB::execute("UPDATE  emails SET flags = 'active'
-                                     WHERE  uid={?} AND email={?}", $uid, $this->email);
+            XDB::execute("UPDATE  emails
+                             SET  panne_level = IF(flags = 'panne', panne_level - 1, panne_level),
+                                  flags = 'active'
+                           WHERE  uid={?} AND email={?}", $uid, $this->email);
            $_SESSION['log']->log("email_on", $this->email.($uid!=S::v('uid') ? "(admin on $uid)" : ""));
             $this->active = true;
+            $this->broken = false;
         }
     }
 
@@ -187,7 +194,7 @@ class Redirect
     {
        $this->uid=$_uid;
         $res = XDB::iterRow("
-           SELECT email, flags='active', rewrite, panne
+           SELECT email, flags, rewrite, panne, last
              FROM emails WHERE uid = {?} AND flags != 'filter'", $_uid);
        $this->emails=Array();
         while ($row = $res->next()) {
index 4ceaebd..6ed30d6 100644 (file)
@@ -283,10 +283,12 @@ Pour ceci changer ses permissions en 'disabled'.
         {if $mail->active}active{/if}
       </td>
       <td>
-        <span class="smaller"><a href="javascript:act_fwd('{$mail->email}',{if $mail->active}false{else}true{/if})">{if $mail->active}des{/if}activer</a></span>
+        <span class="smaller"><a href="javascript:act_fwd('{$mail->email}',{if $mail->active}false{else}true{/if})">{if $mail->active}des{elseif $mail->broken}ré{/if}activer</a></span>
       </td>
       <td>
+        {if $mail->broken}<span style="color: #f00">{/if}
         {$mail->email}
+        {if $mail->broken}<em> (en panne)</em></span>{/if}
       </td>
       <td class="action">
         <a href="javascript:del_fwd('{$mail->email}')">delete</a>
index 3a20b33..25f1d70 100644 (file)
@@ -73,6 +73,12 @@ ton homonyme et toi-m
   </tr>
   <tr class="impair">
     <td>
+      {if $mails->total() eq 0}
+      <p class="erreur">
+        Tu n'as actuellement aucune adressse de redirection. Tout courrier électronique qui t'es adresses
+        ci-dessus génère une erreur. Modifie au plus vite ta liste de redirection.<br/>
+      </p>
+      {else}
       Actuellement, tout courrier électronique qui t'y est adressé, est envoyé
       {if $mails->total() eq 1} à l'adresse {else} aux adresses {/if}
       <ul>
@@ -80,6 +86,7 @@ ton homonyme et toi-m
         <li><strong>{$m.email}</strong></li>
         {/iterate}
       </ul>
+      {/if}
       Si tu souhaites <strong>modifier ce reroutage de ton courrier,</strong>
       <a href="emails/redirect">il te suffit de te rendre ici !</a>
     </td>
index 70b9889..52b094b 100644 (file)
       </tr>
       {foreach from=$emails item=e}
       <tr class="{cycle values="pair,impair"}">
-        <td><strong>{$e->email}</strong></td>
+        <td>
+          <strong>
+            {if $e->broken}<span class="erreur">{/if}
+            {$e->email}
+            {if $e->broken}{icon name=error title="En panne"}</span>{/if}
+          </strong>
+        </td>
         <td>
           <input type="checkbox" name="emails_actifs[]" value="{$e->email}" {if $e->active}checked="checked"{/if} /></td>
         <td>
     <input type="submit" value="Valider les modifications" name="emailop" />
   </div>
 </form>
+<p class="smaller">
+  Les adresses marquées {icon name=error title="En panne"} sont des adresses qui sont considérées comme étant en panne
+  depuis plusieurs mois. Si tu penses qu'il s'agit d'une erreur, tu peux la réactiver. Si une nouvelle panne était détectée
+  sur cette adresse, elle serait immédiatement redésactivée.
+</p>
 
 <h1>Pour les Élèves (non encore diplômés)</h1>
 <p>
diff --git a/upgrade/0.9.11/07_emails.sql b/upgrade/0.9.11/07_emails.sql
new file mode 100644 (file)
index 0000000..9897c8a
--- /dev/null
@@ -0,0 +1,8 @@
+alter table emails add column panne_level tinyint(1) not null default 0 after panne;
+alter table emails change flags flags enum('active', 'filter', 'panne') not null default 'active';
+UPDATE emails SET last = panne WHERE last = 0 AND panne != 0;
+UPDATE emails
+   SET panne_level = 1 
+ WHERE flags = 'active' 
+       AND DATE_ADD(panne, INTERVAL 2 MONTH) > CURDATE();
+