]> git.sommitrealweird.co.uk Git - eoc.git/blobdiff - eoc.py
Remove List-* headers before adding them. Thanks to Johannes Berg.
[eoc.git] / eoc.py
diff --git a/eoc.py b/eoc.py
index 537bccd9be2e9b95ca683513a46247c246e80540..3400d65ce528c14b18943eaecc64a2ab1d1ecb98 100644 (file)
--- a/eoc.py
+++ b/eoc.py
@@ -395,13 +395,21 @@ class MailingListManager:
                "\n    ".join(text[:text.find("\n\n")].split("\n"))))
         if recipients:
             if self.smtp_server:
-                smtp = smtplib.SMTP(self.smtp_server)
-                smtp.sendmail(envelope_sender, recipients, text)
-                smtp.quit()
+                try:
+                    smtp = smtplib.SMTP(self.smtp_server)
+                    smtp.sendmail(envelope_sender, recipients, text)
+                    smtp.quit()
+                except:
+                    error("Error sending SMTP mail, mail probably not sent")
+                    sys.exit(1)
             elif self.qmqp_server:
-                q = qmqp.QMQP(self.qmqp_server)
-                q.sendmail(envelope_sender, recipients, text)
-                q.quit()
+                try:
+                    q = qmqp.QMQP(self.qmqp_server)
+                    q.sendmail(envelope_sender, recipients, text)
+                    q.quit()
+                except:
+                    error("Error sending QMQP mail, mail probably not sent")
+                    sys.exit(1)
             else:
                 recipients = string.join(recipients, " ")
                 f = os.popen("%s -oi -f '%s' %s" % 
@@ -410,7 +418,11 @@ class MailingListManager:
                                   recipients),
                              "w")
                 f.write(text)
-                f.close()
+                status = f.close()
+                if status != 0:
+                    error("%s returned %d, mail sending probably failed" %
+                           (self.sendmail, status))
+                    sys.exit((status >> 8) & 0xff)
         else:
             debug("send_mail: no recipients, not sending")
 
@@ -491,28 +503,32 @@ class MailingList:
         return True
     
     def mime_encode_headers(self, text):
-        headers, body = text.split("\n\n", 1)
-    
-        list = []
-        for line in headers.split("\n"):
-            if line[0].isspace():
-                list[-1] += line
-            else:
-                list.append(line)
-    
-        headers = []
-        for header in list:
-            if self.nice_7bit(header):
-                headers.append(header)
-            else:
-                if ": " in header:
-                    name, content = header.split(": ", 1)
+        try:
+            headers, body = text.split("\n\n", 1)
+        
+            list = []
+            for line in headers.split("\n"):
+                if line[0].isspace():
+                    list[-1] += line
                 else:
-                    name, content = header.split(":", 1)
-                hdr = email.Header.Header(content, "utf-8")
-                headers.append(name + ": " + hdr.encode())
-    
-        return "\n".join(headers) + "\n\n" + body
+                    list.append(line)
+        
+            headers = []
+            for header in list:
+                if self.nice_7bit(header):
+                    headers.append(header)
+                else:
+                    if ": " in header:
+                        name, content = header.split(": ", 1)
+                    else:
+                        name, content = header.split(":", 1)
+                    hdr = email.Header.Header(content, "utf-8")
+                    headers.append(name + ": " + hdr.encode())
+        
+            return "\n".join(headers) + "\n\n" + body
+        except:
+            error("Cannot MIME encode header, using original ones, sorry")
+            return text
 
     def template(self, template_name, dict):
         lang = self.cp.get("list", "language")
@@ -846,15 +862,23 @@ class MailingList:
                 return mail
         headers = mail[:endpos].split("\n")
         body = mail[endpos:]
+        
+        headers_to_remove = [x.lower() for x in headers_to_remove]
     
         remaining = []
         add_continuation_lines = 0
+
         for header in headers:
-            pos = header.find(":")
-            if pos == -1:
+            if header[0] in [' ','\t']:
+                # this is a continuation line
                 if add_continuation_lines:
                     remaining.append(header)
             else:
+                pos = header.find(":")
+                if pos == -1:
+                    # malformed message, try to remove the junk
+                    add_continuation_lines = 0
+                    continue
                 name = header[:pos].lower()
                 if name in headers_to_remove:
                     add_continuation_lines = 0
@@ -874,12 +898,16 @@ class MailingList:
         if "base64" in text or "BASE64" in text:
             import StringIO
             for line in StringIO.StringIO(text):
-                if line.lower.startswith("content-transfer-encoding:") and \
+                if line.lower().startswith("content-transfer-encoding:") and \
                    "base64" in line.lower():
                     return text
         return text + self.template("footer", {})
 
     def send_mail_to_subscribers(self, text):
+        text = self.remove_some_headers(text, ["list-id", "list-help",
+                                               "list-unsubscribe",
+                                               "list-subscribe", "list-post",
+                                               "list-owner", "precedence"])
         text = self.headers_to_add() + self.list_headers() + \
                self.headers_to_remove(text)
         text = self.append_footer(text)