diff roundup/mailgw.py @ 1945:7e4058dfb29b

ignore incoming email with "Precedence: bulk" (patch [SF#843489])
author Richard Jones <richard@users.sourceforge.net>
date Thu, 04 Dec 2003 23:34:25 +0000
parents 20cfd25cffda
children ca2dca3db172
line wrap: on
line diff
--- a/roundup/mailgw.py	Thu Dec 04 23:14:10 2003 +0000
+++ b/roundup/mailgw.py	Thu Dec 04 23:34:25 2003 +0000
@@ -73,7 +73,7 @@
 an exception, the original message is bounced back to the sender with the
 explanatory message given in the exception. 
 
-$Id: mailgw.py,v 1.138 2003-11-13 03:41:38 richard Exp $
+$Id: mailgw.py,v 1.139 2003-12-04 23:34:25 richard Exp $
 """
 
 import string, re, os, mimetools, cStringIO, smtplib, socket, binascii, quopri
@@ -92,14 +92,22 @@
     pass
 
 class MailUsageHelp(Exception):
-    pass
-
-class MailLoop(Exception):
-    """ We've seen this message before... """
+    """ We need to send the help message to the user. """
     pass
 
 class Unauthorized(Exception):
     """ Access denied """
+    pass
+
+class IgnoreMessage(Exception):
+    """ A general class of message that we should ignore. """
+    pass
+class IgnoreBulk(IgnoreMessage):
+        """ This is email from a mailing list or from a vacation program. """
+        pass
+class IgnoreLoop(IgnoreMessage):
+        """ We've seen this message before... """
+        pass
 
 def initialiseSecurity(security):
     ''' Create some Permissions and Roles on the security object
@@ -300,53 +308,7 @@
         sendto = message.getaddrlist('resent-from')
         if not sendto:
             sendto = message.getaddrlist('from')
-        if sendto:
-            if not self.trapExceptions:
-                return self.handle_message(message)
-            try:
-                return self.handle_message(message)
-            except MailUsageHelp:
-                # bounce the message back to the sender with the usage message
-                fulldoc = '\n'.join(string.split(__doc__, '\n')[2:])
-                sendto = [sendto[0][1]]
-                m = ['']
-                m.append('\n\nMail Gateway Help\n=================')
-                m.append(fulldoc)
-                self.mailer.bounce_message(message, sendto, m,
-                    subject="Mail Gateway Help")
-            except MailUsageError, value:
-                # bounce the message back to the sender with the usage message
-                fulldoc = '\n'.join(string.split(__doc__, '\n')[2:])
-                sendto = [sendto[0][1]]
-                m = ['']
-                m.append(str(value))
-                m.append('\n\nMail Gateway Help\n=================')
-                m.append(fulldoc)
-                self.mailer.bounce_message(message, sendto, m)
-            except Unauthorized, value:
-                # just inform the user that he is not authorized
-                sendto = [sendto[0][1]]
-                m = ['']
-                m.append(str(value))
-                self.mailer.bounce_message(message, sendto, m)
-            except MailLoop:
-                # XXX we should use a log file here...
-                return
-            except:
-                # bounce the message back to the sender with the error message
-                # XXX we should use a log file here...
-                sendto = [sendto[0][1], self.instance.config.ADMIN_EMAIL]
-                m = ['']
-                m.append('An unexpected error occurred during the processing')
-                m.append('of your message. The tracker administrator is being')
-                m.append('notified.\n')
-                m.append('----  traceback of failure  ----')
-                s = cStringIO.StringIO()
-                import traceback
-                traceback.print_exc(None, s)
-                m.append(s.getvalue())
-                self.mailer.bounce_message(message, sendto, m)
-        else:
+        if not sendto:
             # very bad-looking message - we don't even know who sent it
             # XXX we should use a log file here...
             sendto = [self.instance.config.ADMIN_EMAIL]
@@ -358,6 +320,56 @@
             m.append('')
             self.mailer.bounce_message(message, sendto, m,
                 subject='Badly formed message from mail gateway')
+            return
+
+        # try normal message-handling
+        if not self.trapExceptions:
+            return self.handle_message(message)
+        try:
+            return self.handle_message(message)
+        except MailUsageHelp:
+            # bounce the message back to the sender with the usage message
+            fulldoc = '\n'.join(string.split(__doc__, '\n')[2:])
+            sendto = [sendto[0][1]]
+            m = ['']
+            m.append('\n\nMail Gateway Help\n=================')
+            m.append(fulldoc)
+            self.mailer.bounce_message(message, sendto, m,
+                subject="Mail Gateway Help")
+        except MailUsageError, value:
+            # bounce the message back to the sender with the usage message
+            fulldoc = '\n'.join(string.split(__doc__, '\n')[2:])
+            sendto = [sendto[0][1]]
+            m = ['']
+            m.append(str(value))
+            m.append('\n\nMail Gateway Help\n=================')
+            m.append(fulldoc)
+            self.mailer.bounce_message(message, sendto, m)
+        except Unauthorized, value:
+            # just inform the user that he is not authorized
+            sendto = [sendto[0][1]]
+            m = ['']
+            m.append(str(value))
+            self.mailer.bounce_message(message, sendto, m)
+        except IgnoreMessage:
+            # XXX we should use a log file here...
+            # do not take any action
+            # this exception is thrown when email should be ignored
+            return
+        except:
+            # bounce the message back to the sender with the error message
+            # XXX we should use a log file here...
+            sendto = [sendto[0][1], self.instance.config.ADMIN_EMAIL]
+            m = ['']
+            m.append('An unexpected error occurred during the processing')
+            m.append('of your message. The tracker administrator is being')
+            m.append('notified.\n')
+            m.append('----  traceback of failure  ----')
+            s = cStringIO.StringIO()
+            import traceback
+            traceback.print_exc(None, s)
+            m.append(s.getvalue())
+            self.mailer.bounce_message(message, sendto, m)
 
     def get_part_data_decoded(self,part):
         encoding = part.getencoding()
@@ -397,7 +409,11 @@
         '''
         # detect loops
         if message.getheader('x-roundup-loop', ''):
-            raise MailLoop
+            raise IgnoreLoop
+
+        # detect Precedence: Bulk
+        if (message.getheader('precedence', '') == 'bulk'):
+            raise IgnoreBulk
 
         # XXX Don't enable. This doesn't work yet.
 #  "[^A-z.]tracker\+(?P<classname>[^\d\s]+)(?P<nodeid>\d+)\@some.dom.ain[^A-z.]"

Roundup Issue Tracker: http://roundup-tracker.org/