Skip to content

Instantly share code, notes, and snippets.

@mmonaco
Created September 29, 2012 05:24
Show Gist options
  • Save mmonaco/3803258 to your computer and use it in GitHub Desktop.
Save mmonaco/3803258 to your computer and use it in GitHub Desktop.
write-multipart-mime
#!/usr/bin/python2
# largely taken from python examples
# http://docs.python.org/library/email-examples.html
import os
import sys
import smtplib
# For guessing MIME type based on file name extension
import mimetypes
from email import encoders
from email.message import Message
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from optparse import OptionParser
import gzip
COMMASPACE = ', '
starts_with_mappings = {
'#include': 'text/x-include-url',
'#!': 'text/x-shellscript',
'#cloud-config': 'text/cloud-config',
'#cloud-config-archive': 'text/cloud-config-archive',
'#upstart-job': 'text/upstart-job',
'#part-handler': 'text/part-handler',
'#cloud-boothook': 'text/cloud-boothook'
}
def get_type(fname, deftype):
f = file(fname, "rb")
line = f.readline()
f.close()
rtype = deftype
# slist is sorted longest first
slist = sorted(starts_with_mappings.keys(), key=lambda e: 0 - len(e))
for sstr in slist:
if line.startswith(sstr):
rtype = starts_with_mappings[sstr]
break
return(rtype)
def main():
outer = MIMEMultipart()
#outer['Subject'] = 'Contents of directory %s' % os.path.abspath(directory)
#outer['To'] = COMMASPACE.join(opts.recipients)
#outer['From'] = opts.sender
#outer.preamble = 'You will not see this in a MIME-aware mail reader.\n'
parser = OptionParser()
parser.add_option("-o", "--output", dest="output",
help="write output to FILE [default %default]", metavar="FILE",
default="-")
parser.add_option("-z", "--gzip", dest="compress", action="store_true",
help="compress output", default=False)
parser.add_option("-d", "--default", dest="deftype",
help="default mime type [default %default]", default="text/plain")
parser.add_option("--delim", dest="delim",
help="delimiter [default %default]", default=":")
(options, args) = parser.parse_args()
if (len(args)) < 1:
parser.error("Must give file list see '--help'")
for arg in args:
t = arg.split(options.delim, 1)
path = t[0]
if len(t) > 1:
mtype = t[1]
else:
mtype = get_type(path, options.deftype)
maintype, subtype = mtype.split('/', 1)
if maintype == 'text':
fp = open(path)
# Note: we should handle calculating the charset
msg = MIMEText(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=os.path.basename(path))
outer.attach(msg)
if options.output is "-":
ofile = sys.stdout
else:
ofile = file(options.output, "wb")
if options.compress:
gfile = gzip.GzipFile(fileobj=ofile, filename=options.output)
gfile.write(outer.as_string())
gfile.close()
else:
ofile.write(outer.as_string())
ofile.close()
if __name__ == '__main__':
main()
# vi: ts=4 expandtab
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment