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()