Entry
is there code that sends the contents of a directory as a multi-part mime message to e-mail recipients?
Feb 5th, 2002 17:57
Beverly Dolor, Wolfgang Lipp, http://www.python.org/doc/current/lib/module-email.html
Found this on Python Library Reference section 12.2.10 Examples (under
the email module)
#!/usr/bin/env python
"""Send the contents of a directory as a MIME message.
Usage: dirmail [options] from to [to ...]*
Options:
-h / --help
Print this message and exit.
-d directory
--directory=directory
Mail the contents of the specified directory, otherwise use
the
current directory. Only the regular files in the directory
are sent,
and we don't recurse to subdirectories.
`from' is the email address of the sender of the message.
`to' is the email address of the recipient of the message, and
multiple
recipients may be given.
The email is sent by forwarding to your local SMTP server, which
then does the
normal delivery process. Your local machine must be running an
SMTP server.
"""
import sys
import os
import getopt
import smtplib
# For guessing MIME type based on file name extension
import mimetypes
from email import Encoders
from email.Message import Message
from email.MIMEAudio import MIMEAudio
from email.MIMEBase import MIMEBase
from email.MIMEImage import MIMEImage
from email.MIMEText import MIMEText
COMMASPACE = ', '
def usage(code, msg=''):
print >> sys.stderr, __doc__
if msg:
print >> sys.stderr, msg
sys.exit(code)
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'hd:', ['help',
'directory='])
except getopt.error, msg:
usage(1, msg)
dir = os.curdir
for opt, arg in opts:
if opt in ('-h', '--help'):
usage(0)
elif opt in ('-d', '--directory'):
dir = arg
if len(args) < 2:
usage(1)
sender = args[0]
recips = args[1:]
# Create the enclosing (outer) message
outer = MIMEBase('multipart', 'mixed')
outer['Subject'] = 'Contents of directory \%s' \%
os.path.abspath(dir)
outer['To'] = sender
outer['From'] = COMMASPACE.join(recips)
outer.preamble = 'You will not see this in a MIME-aware mail
reader.\n'
# To guarantee the message ends with a newline
outer.epilogue = ''
for filename in os.listdir(dir):
path = os.path.join(dir, filename)
if not os.path.isfile(path):
continue
# Guess the Content-Type: based on the file's extension.
Encoding
# will be ignored, although we should check for simple
things like
# gzip'd or compressed files
ctype, encoding = mimetypes.guess_type(path)
if ctype is None or encoding is not None:
# No guess could be made, or the file is encoded
(compressed), so
# use a generic bag-of-bits type.
ctype = 'application/octet-stream'
maintype, subtype = ctype.split('/', 1)
if maintype == 'text':
fp = open(path)
# Note: we should handle calculating the charset
msg = MIMEText(fp.read(), _subtype=subtype)
fp.close()
elif maintype == 'image':
fp = open(path, 'rb')
msg = MIMEImage(fp.read(), _subtype=subtype)
fp.close()
elif maintype == 'audio':
fp = open(path, 'rb')
msg = MIMEAudio(fp.read(), _subtype=subtype)
fp.close()
else:
fp = open(path, 'rb')
msg = MIMEBase(maintype, subtype)
msg.add_payload(fp.read())
fp.close()
# Encode the payload using Base64
Encoders.encode_base64(msg)
# Set the filename parameter
msg.add_header('Content-Disposition', 'attachment',
filename=filename)
outer.attach(msg)
fp = open('/tmp/debug.pck', 'w')
import cPickle
cPickle.dump(outer, fp)
fp.close()
# Now send the message
s = smtplib.SMTP()
s.connect()
s.sendmail(sender, recips, outer.as_string(0))
s.close()
if __name__ == '__main__':
main()