summaryrefslogtreecommitdiff
path: root/tools/write-mime-multipart
blob: 46032728bfeaac9e44b77b7df15f8e13496721c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/usr/bin/python
# 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',
    '#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
    for str,mtype in starts_with_mappings.items():
        if line.startswith(str):
            rtype = mtype
            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()