X-Git-Url: https://projects.mako.cc/source/attachcheck/blobdiff_plain/6d218b1151bdebf069401152960f6631d8d8b0f8..HEAD:/attachcheck diff --git a/attachcheck b/attachcheck index e5ac549..19159e4 100755 --- a/attachcheck +++ b/attachcheck @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # AttachCheck -- A MTA wrapper to help check outgoing email for # forgotten attachments. @@ -34,11 +34,11 @@ ignored_types = ( "applica/pgp-signat", "application/pgp-signature" ) # list of regular expressions which we will view as being indicative # of an attachment -attachment_regexes = [ r'\battach(ed|ment|ing)?\b(?im)', - r'\balleg(o|at[oaie]|ando)(?im)' ] +attachment_regexes = [ r'\battach(ed|ment|ing)?\b', + r'\balleg(o|at[oaie]|ando)' ] # ignore quoted text (which might refer to attachments in previous emails) -attachment_regexes = [ r'(^|^[^\n>].*)' + x for x in attachment_regexes ] +attachment_regexes = [ r'(?im)(^|^[^\n>].*)' + x for x in attachment_regexes ] ### No Edit Below This Line ########################################### @@ -49,7 +49,7 @@ import email import re ## SUB: send message -def send_message(): +def send_message(message): global sendmail @@ -58,13 +58,15 @@ def send_message(): cmd[0] = sendmail from subprocess import Popen, PIPE - mailpipe = Popen(cmd, stdin=PIPE).stdin - mailpipe.write( message_string ) - sys.exit( mailpipe.close() ) + process = Popen(cmd, stdin=PIPE) + mailpipe = process.stdin + mailpipe.write( message.as_string().encode() ) + mailpipe.close() + sys.exit( process.wait() ) ## SUB: print error message def print_error(): - print >>sys.stderr, \ + print(\ """(Your message mentions attachments but does not include any. Either: @@ -76,11 +78,11 @@ Either: (2) Add a \"X-AttachCheck-Override: Yes\" header the message. -Read the documentation for AttachCheck for more details.""" +Read the documentation for AttachCheck for more details.""", file=sys.stderr) # get the mail from stdin -message_string = sys.stdin.read() -message = email.message_from_string( message_string ) +message_bytes = sys.stdin.buffer.read() +message = email.message_from_bytes( message_bytes ) attachment_expected = False attachment_seen = False @@ -107,8 +109,8 @@ for part in message.walk(): attachment_expected = True # check to see if this mime-type is something we can ignore - elif ( re.match( r'message/(?m)', part.get_content_type() ) or - re.match( r'multipart/(?m)', part.get_content_type() ) or + elif ( re.match( r'(?m)message/', part.get_content_type() ) or + re.match( r'(?m)multipart/', part.get_content_type() ) or part.get_content_type() in ignored_types ): continue @@ -122,21 +124,22 @@ if attachment_expected: # if we are expecting an attachment and we've seen one, we should # send the file and be done with things if attachment_seen: - send_message() + send_message(message) # if we are expected have not seen it, we need to check to see if # the mail has been confirmed else: # check for the confirmation - - if re.search( r'Subject: CONFIRM', message_string ): - message_string = re.sub( r'(Subject: )(CONFIRM )(.*?)\n', - r'\1\3\n', message_string ) - send_message() - - elif message.get( 'X-AttachCheck-Override' ) == "Yes": - send_message() + subject_string = message['Subject'] + print(subject_string) + if re.search( r'^\s*CONFIRM', subject_string ): + subject_string = re.sub( r'(CONFIRM )(.*?)', r'\2', subject_string ) + message['Subject'] = subject_string + send_message(message) + + elif message['X-AttachCheck-Override'] == "Yes": + send_message(message) else: print_error() @@ -145,4 +148,4 @@ if attachment_expected: # if we are not expecting anything more, we should send the message else: - send_message() + send_message(message)