124 lines
3.6 KiB
Python
124 lines
3.6 KiB
Python
#!/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.MIMEMultipart import MIMEMultipart
|
|
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 = MIMEMultipart()
|
|
outer['Subject'] = 'Contents of directory %s' % os.path.abspath(dir)
|
|
outer['To'] = COMMASPACE.join(recips)
|
|
outer['From'] = sender
|
|
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.set_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)
|
|
|
|
# Now send the message
|
|
s = smtplib.SMTP()
|
|
s.connect()
|
|
s.sendmail(sender, recips, outer.as_string())
|
|
s.close()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|