+#!/usr/bin/env python
+
+# (c) 2004 -- Benjamin Mako Hill <mako@bork.hampshire.edu>
+
+__copyright__ = "Copyright (c) 2004 Benjamin Mako Hill"
+__author__ = "Benjamin Mako Hill <mako@debian.org>"
+
+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()