AttachCheck It was written in Benjamin Mako Hill. You can find the
latest version of this program, more information, and some of Mako's
sometime accidentally insightful or useful ideas at his eponymous
-homepage at: http://mako.cc
+homepage at: https://mako.cc
The AttachCheck website with the latest version of the program is always
-available here: http://mako.cc/projects/attachcheck/
+available here: https://mako.cc/projects/attachcheck/
The latest version of source code is kepted in a Git repository at
-http://projects.mako.cc/source/?p=attachcheck and can be checked out or
+https://projects.mako.cc/source/attachcheck and can be checked out or
branched with the command::
git clone git://projects.mako.cc/attachcheck
-#!/usr/bin/env python
+#!/usr/bin/env python3
# AttachCheck -- A MTA wrapper to help check outgoing email for
# forgotten attachments.
# 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
###########################################
import re
## SUB: send message
-def send_message():
+def send_message(message):
global sendmail
from subprocess import Popen, PIPE
process = Popen(cmd, stdin=PIPE)
mailpipe = process.stdin
- mailpipe.write( message_string )
+ 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:
(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
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
# 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()
# if we are not expecting anything more, we should send the message
else:
- send_message()
+ send_message(message)