#!/usr/bin/env python # (c) 2004 -- Benjamin Mako Hill __copyright__ = "Copyright (c) 2004 Benjamin Mako Hill" __author__ = "Benjamin Mako Hill " import sys import os import re import email # location of the sendmail binary sendmail = "/usr/sbin/sendmail" # list of mimetype which are, for the sake of this program, not # attachments ignored_types = ( "applica/pgp-signat", "application/pgp-signature" ) def send_message(): mailpipe = os.popen("%s -t" % sendmail, 'w') mailpipe.write( message_string ) sys.exit( mailpipe.close() ) # get the mail from stdin message_string = sys.stdin.read() message = email.message_from_string( message_string ) attachment_expected = False attachment_seen = False text_seen = False for part in message.walk(): # check to see if this part is a plain text entry if part.get_content_type() == "text/plain": # if this is the second text block, we should interrate # through things if text_seen: attachment_seen = True # otherwise, mark that we've now seen one text field else: text_seen = True # search for the word "attach" or "attached" or "attachment" # in the body of the message if re.search( r'\battach(ed|ment)?\b(?im)', part.get_payload() ): 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 part.get_content_type() in ignored_types ): continue # if it's not text and it's an ignored type, it's a seen attachment else: attachment_seen = True # now check to see if we are expecting an attachment 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() # 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() else: print >>sys.stderr, "Your message mentions attachments but does not include any." print >>sys.stderr print >>sys.stderr, "Either add an attachment or add \"CONFIRM\" (in ALLCAPS)" print >>sys.stderr, "to beginning of the subject of the message and resend." print >>sys.stderr print >>sys.stderr, "\"CONFIRM\" will be stripped from your message subject before" print >>sys.stderr, "the message is sent." sys.exit( 1 ) ## else: ## answer = '' ## while not answer: ## answer = 'n' ## answer = raw_input( "No attachment detected.\n" ## "Are you sure you want to send this?" ## " [Y/N]: " ) ## # send the mail without the attachment ## if answer == "y": ## send_message() ## # go back and let us reattach the message ## elif answer == "n": ## sys.exit( 1 ) ## # no good answer ask again ## else: ## answer = '' # if we are not expecting anything more, we should send the message else: send_message()