Skip to content

Instantly share code, notes, and snippets.

@rnaveiras
Created November 10, 2014 13:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save rnaveiras/a64d0ce4bd864630be3e to your computer and use it in GitHub Desktop.
Save rnaveiras/a64d0ce4bd864630be3e to your computer and use it in GitHub Desktop.
#!/usr/bin/python
# largely taken from python examples
# http://docs.python.org/library/email-examples.html
import os
import sys
from email import encoders
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',
'#include-once': 'text/x-include-once-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