Don't lose the attachment when email can't be sent
authorx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Wed, 21 Mar 2007 14:10:11 +0000 (14:10 +0000)
committerx2003bruneau <x2003bruneau@839d8a87-29fc-0310-9880-83ba4fa771e5>
Wed, 21 Mar 2007 14:10:11 +0000 (14:10 +0000)
git-svn-id: svn+ssh://murphy/home/svn/platal/trunk@1594 839d8a87-29fc-0310-9880-83ba4fa771e5

classes/plmailer.php
classes/plupload.php
modules/email.php
templates/emails/send.tpl

index e177fc4..d220ad7 100644 (file)
@@ -218,6 +218,12 @@ class PlMailer extends Mail_Mime {
         }
     }
 
+    public function addUploadAttachment(PlUpload &$upload, $name)
+    {
+        $encoding = $upload->isType('text') ? 'quoted-printable' : 'base64';
+        $this->addAttachment($upload->getContents(), $upload->contentType(), $name, false, $encoding);
+    }
+
     public function assign($var, $value)
     {
         if (!is_null($this->page)) {
index 743a090..b3dbb56 100644 (file)
@@ -139,22 +139,46 @@ class PlUpload
         return file_exists($this->filename);
     }
 
-    static public function listFiles($forlife = '*', $category = '*', $basename = false)
+    static public function listRawFiles($forlife = '*', $category = '*', $uniq = false, $basename = false)
     {
         global $globals;
         $filename = $globals->spoolroot . '/spool/uploads/temp/';
         $filename .= $forlife . '-' . $category;
+        if (!$uniq) {
+            $filename .= '-*';
+        }
         $files = glob($filename);
         if ($basename) {
-            array_walk($files, 'basename');
+            $files = array_map('basename', $files);
+        }
+        return $files;
+    }
+
+    static public function listFilenames($forlife = '*', $category = '*')
+    {
+        $files = PlUpload::listRawFiles($forlife, $category, false, true);
+        foreach ($files as &$name) {
+            list($forlife, $cat, $fn) = explode('-', $name, 3);
+            $name = $fn;
         }
         return $files;
     }
 
-    static public function clear($user = '*', $category = '*')
+    static public function &listFiles($forlife = '*', $category = '*', $uniq = false)
+    {
+        $res   = array();
+        $files = PlUpload::listRawFiles($forlife, $category, $uniq, true);
+        foreach ($files as $name) {
+            list($forlife, $cat, $fn) = explode('-', $name, 3);
+            $res[$fn] = new PlUpload($forlife, $cat, $fn);
+        }
+        return $res;
+    }
+
+    static public function clear($user = '*', $category = '*', $uniq = false)
     {
-        $files = PlUpload::listFiles($user, $category, false);
-        array_walk($files, 'unlink');
+        $files = PlUpload::listRawFiles($user, $category, $uniq, false);
+        array_map('unlink', $files);
     }
 
     public function contentType()
index 49ba3c4..981b7db 100644 (file)
@@ -300,6 +300,7 @@ class EmailModule extends PLModule
         global $globals;
 
         $page->changeTpl('emails/send.tpl');
+        $page->addJsLink('ajax.js');
 
         $page->assign('xorg_title','Polytechnique.org - Envoyer un email');
 
@@ -319,6 +320,12 @@ class EmailModule extends PLModule
                 return join(', ', $ret);
             }
 
+            foreach ($_FILES as &$file) {
+                if (!PlUpload::get($file, S::v('forlife'), 'emails.send', false)) {
+                    $page->trig("Impossible de télécharger '" . pl_entities($file['name']) . "'");
+                }
+            }
+
             $to2  = getEmails(Env::v('to_contacts'));
             $cc2  = getEmails(Env::v('cc_contacts'));
             $txt  = str_replace('^M', '', Env::v('contenu'));
@@ -330,6 +337,7 @@ class EmailModule extends PLModule
 
             if (empty($to) && empty($cc) && empty($to2)) {
                 $page->trig("Indique au moins un destinataire.");
+                $page->assign('uploaded_f', PlUpload::listFilenames(S::v('forlife'), 'emails.send'));
             } else {
                 $mymail = new PlMailer();
                 $mymail->setFrom($from);
@@ -339,20 +347,22 @@ class EmailModule extends PLModule
                 if (!empty($bcc)) { $mymail->addBcc($bcc); }
                 if (!empty($to2)) { $mymail->addTo($to2); }
                 if (!empty($cc2)) { $mymail->addCc($cc2); }
-                if (is_uploaded_file($_FILES['uploaded']['tmp_name'])) {
-                    $mymail->addAttachment($_FILES['uploaded']['tmp_name'],
-                                           $_FILES['uploaded']['type'],
-                                           $_FILES['uploaded']['name']);  
+                $files =& PlUpload::listFiles(S::v('forlife'), 'emails.send');
+                foreach ($files as $name=>&$upload) {
+                    $mymail->addUploadAttachment($upload, $name);
                 }
-                $mymail->setTxtBody(wordwrap($txt,72,"\n"));
+                $mymail->setTxtBody(wordwrap($txt, 78, "\n"));
                 if ($mymail->send()) {
                     $page->trig("Ton mail a bien été envoyé.");
                     $_REQUEST = array('bcc' => S::v('bestalias').'@'.$globals->mail->domain);
+                    PlUpload::clear(S::v('forlife'), 'emails.send');
                 } else {
                     $page->trig("Erreur lors de l'envoi du courriel, réessaye.");
+                    $page->assign('uploaded_f', PlUpload::listFilenames(S::v('forlife'), 'emails.send'));
                 }
             }
         } else {
+            PlUpload::clear(S::v('forlife'), 'emails.send');
             $_REQUEST['bcc'] = S::v('bestalias').'@'.$globals->mail->domain;
         }
 
index f24d0aa..1b4f2d1 100644 (file)
 -- 
 {$smarty.session.prenom} {$smarty.session.nom}
 {/if}</textarea>
-    <div>
+    <script type="text/javascript">//<![CDATA[
+      {literal}
+      function removeAttachments()
+      {
+          Ajax.update_html(null, 'emails/send', null);
+          document.getElementById('att_already').style.display = 'none';
+          document.getElementById('att_form').style.display = '';
+      }
+      {/literal}
+    //]]></script>
+    {if $uploaded_f|@count}
+    <div id="att_already">
+      <strong>{icon name=email_attach}&nbsp;Pièce jointe&nbsp;:&nbsp;</strong>
+      {$uploaded_f[0]}
+      <a href="javascript:removeAttachments()">
+        <img src="images/icons/bin_empty.gif" alt="Supprimer" title="Supprimer la pièce jointe" />
+      </a>
+    </div>
+    {/if}
+    <div id="att_form" {if $uploaded_f|@count neq 0}style="display: none"{/if}>
       <strong>{icon name=email_attach}&nbsp;Ajouter une pièce jointe&nbsp;:&nbsp;</strong>
       <input type="file" name="uploaded" />
     </div>