# (c) 2004 -- Benjamin Mako Hill <mako@bork.hampshire.edu>
+# TODO:
+# * check for an attachment overrides line as an alternative type of option
+
__copyright__ = "Copyright (c) 2004 Benjamin Mako Hill"
__author__ = "Benjamin Mako Hill <mako@debian.org>"
-import sys
-import os
import re
-import email
+
+### Configuration Options
+###########################################
# 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" )
+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)?\b(?im)' ]
+
+### No Need To Edit Below This Line
+###########################################
+
+import sys
+import os
+import email
+
+## SUB: send message
def send_message():
mailpipe = os.popen("%s -t" % sendmail, 'w')
mailpipe.write( message_string )
sys.exit( mailpipe.close() )
+## SUB: print error message
+def print_error():
+ print >>sys.stderr, \
+"""(Your message mentions attachments but does not include any.
+
+Either:
+
+ (1) Add an attachment or add \"CONFIRM\" (in ALLCAPS to beginning of
+ the subject of the message and resend. \"CONFIRM\" will be
+ stripped from your message subject befor the message is sent.
+
+
+ (2) Add a \"X-AttachCheck-Override: Yes\" header the message.
+
+Read the documentation for AttachCheck for more details."""
+
# get the mail from stdin
message_string = sys.stdin.read()
message = email.message_from_string( message_string )
# 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
+ for regex in attachment_regexes:
+
+ if re.search( regex, 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
# 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()
+
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."
+ print_error()
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:
--- /dev/null
+From mako@atdot.cc Sat Jul 2 15:30:08 2005
+Date: Sat, 2 Jul 2005 15:30:08 +0200
+From: "Benj. Mako Hill" <mako@atdot.cc>
+To: mako@atdot.cc
+Subject: CONFIRM forgotten attachment (signed)
+Message-ID: <20050702133008.GC18291@yukidoke.org>
+Mime-Version: 1.0
+Content-Type: multipart/signed; micalg=pgp-sha1;
+ protocol="application/pgp-signature"; boundary="mYYhpFXgKVw71fwr"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.6+20040907i
+Status: RO
+Content-Length: 668
+
+--mYYhpFXgKVw71fwr
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+Content-Transfer-Encoding: quoted-printable
+
+attached
+
+--=20
+Benjamin Mako Hill
+mako@atdot.cc
+http://mako.cc/
+
+Creativity can be a social contribution, but only in so
+far as society is free to use the results. --RMS
+
+--mYYhpFXgKVw71fwr
+Content-Type: application/pgp-signature; name="signature.asc"
+Content-Description: Digital signature
+Content-Disposition: inline
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.5 (GNU/Linux)
+
+iD8DBQFCxpbgic1LIWB1WeYRAiqXAKCNEXlhCgDx9N5SXuDfRcmuQrZfFACgzihb
+kvM5gTRPDzdPgcKAIaWGCHk=
+=f0Xi
+-----END PGP SIGNATURE-----
+
+--mYYhpFXgKVw71fwr--
+
--- /dev/null
+From mako@atdot.cc Sat Jul 2 15:30:08 2005
+Date: Sat, 2 Jul 2005 15:30:08 +0200
+From: "Benj. Mako Hill" <mako@atdot.cc>
+To: mako@atdot.cc
+Subject: forgotten attachment (signed)
+Message-ID: <20050702133008.GC18291@yukidoke.org>
+Mime-Version: 1.0
+X-AttachCheck-Override: Yes
+Content-Type: multipart/signed; micalg=pgp-sha1;
+ protocol="application/pgp-signature"; boundary="mYYhpFXgKVw71fwr"
+Content-Disposition: inline
+User-Agent: Mutt/1.5.6+20040907i
+Status: RO
+Content-Length: 668
+
+
+--mYYhpFXgKVw71fwr
+Content-Type: text/plain; charset=us-ascii
+Content-Disposition: inline
+Content-Transfer-Encoding: quoted-printable
+
+attached
+
+--=20
+Benjamin Mako Hill
+mako@atdot.cc
+http://mako.cc/
+
+Creativity can be a social contribution, but only in so
+far as society is free to use the results. --RMS
+
+--mYYhpFXgKVw71fwr
+Content-Type: application/pgp-signature; name="signature.asc"
+Content-Description: Digital signature
+Content-Disposition: inline
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.2.5 (GNU/Linux)
+
+iD8DBQFCxpbgic1LIWB1WeYRAiqXAKCNEXlhCgDx9N5SXuDfRcmuQrZfFACgzihb
+kvM5gTRPDzdPgcKAIaWGCHk=
+=f0Xi
+-----END PGP SIGNATURE-----
+
+--mYYhpFXgKVw71fwr--
+