zhasm
6/13/2013 - 3:47 AM

send attachment under commandline. using standard libs from python, and gen raw mail then send with `sendmail -t`

send attachment under commandline. using standard libs from python, and gen raw mail then send with sendmail -t

#!/usr/bin/env   python
# -*- encoding:  utf-8 -*-
#
#       Author:  Rex Zhang
#  Create Time:  2013-06-13 10:54
#    File name:  att.py


from hashlib import md5
import argparse
from base64 import b64encode as b64
import os

DEFAULT_FROM = 'rex@zhasm.com'
DEFAULT_TO = 'rex@zhasm.com'

def getArgs():
    """show argpase snippets"""

    parser = argparse.ArgumentParser()
    parser.add_argument('-a', '--attach', nargs='+', help="0 or more files as attachment")
    parser.add_argument('-s', '--subj', nargs='?', help='subject')
    parser.add_argument('-f', '--from', nargs='?', default=DEFAULT_FROM,
                        help='from address. default=%s' % DEFAULT_FROM)
    parser.add_argument('-t', '--to', nargs='?', default=DEFAULT_TO,
                        help='to address. default=%s' % DEFAULT_TO)

    return parser.parse_args(), parser.print_help

class Mailer():
    def __init__(self):
        self.args, self.helper = getArgs()

    def makeBoundary(self):
        try:

            assert self.args.attach
        except Exception as e:
            self.helper()
            exit()

        fn = self.args.attach[0]
        self.args.boundary = md5(fn).hexdigest()[:16]

    def makeBody(self):
        args = self.args

        if not hasattr(args, 'attach') or not args.attach:
            self.args.body = ''
            return

        format = """
--%(b)s
Content-Type: application/octet-stream
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="%(fn)s"

%(b64)s"""
        bd = []
        for a in args.attach:
            s = format % {
                'b': args.boundary,
                'fn': a,
                'b64': b64(open(a, 'r').read())
                }
            bd.append(s)

        self.args.body = '\n'.join(bd)

    def genMail(self):
        args = self.args
        mail = '''Content-Type: multipart/related; boundary="%(boundary)s"
MIME-Version: 1.0
Subject: %(subj)s
From: %(from)s
To: %(to)s

%(body)s
--%(boundary)s--''' % vars(args)
        self.mail = mail

    def do(self):
        self.makeBoundary()
        self.makeBody()
        self.genMail()
        os.popen('''echo '%s' |sendmail -t''' % self.mail)
        print "Email %s has been sent to %s." % (self.args.subject, self.args.to)

if __name__ == '__main__':
    m = Mailer()
    m.do()