#!/usr/bin/env python # -*- coding: utf-8 -*- class ConfigFile: def __init__(self): from os.path import expanduser home = expanduser('~') self.rcfile = '%s/.mailfilerc' % home self.loadConfigFile() def initConfigFile(self): c = '''[mail] from=xxx@@xxx.com to=xxx@@xxx.com [smtp] host=smtp.xxx.com port=25 user=xxx passwd=xxx ''' f = open(self.rcfile, 'w') f.write(c) f.close() def loadConfigFile(self): import ConfigParser from os.path import exists if exists(self.rcfile): cf = ConfigParser.ConfigParser() cf.read(self.rcfile) self.host = cf.get('smtp', 'host') self.port = cf.getint('smtp', 'port') self.user = cf.get('smtp', 'user') self.passwd = cf.get('smtp', 'passwd') self.FROM = cf.get('mail','from') self.TO = cf.get('mail','to') else: self.initConfigFile() print ('** Please edit the config file %s !!!' % self.rcfile) def sendmail(host, port, user, passwd, data): import email, smtplib msg = email.message_from_string(data) FROM = email.utils.parseaddr(msg.get('from'))[1] TO = email.utils.parseaddr(msg.get('to'))[1] h = email.Header.Header(msg.get('subject')) SUBJECT = email.Header.decode_header(h)[0][0] print (('Connecting SMTP server %s ...') % host) smtp = smtplib.SMTP() smtp.connect('%s:%d' %(host, port)) smtp.login(user, passwd) print (('send mail %s to <%s> ...') % (SUBJECT.decode('utf-8'), TO)) smtp.sendmail(FROM, TO, data) smtp.quit() print (('mail sended. ^_^')) class mail: def __init__(self, FROM, TO, SUBJECT = None, CHARSET = 'utf-8'): from email.mime.multipart import MIMEMultipart self.FROM = FROM self.TO = TO self.SUBJECT = SUBJECT self.CHARSET = CHARSET self.text = '' self.fileinfo = '/n----/n' self.files = [] self.msg = MIMEMultipart() self.msg['From'] = self.FROM self.msg['To'] = self.TO def addtext(self, text = ''): self.text += text def addfile(self, FILE): import mimetypes from email.mime.image import MIMEImage from os.path import basename fileName = r'%s' % FILE baseName = basename(fileName) ctype, encoding = mimetypes.guess_type(fileName) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype, subtype = ctype.split('/', 1) att = MIMEImage((lambda f: (f.read(), f.close())) / (open(fileName, 'rb'))[0], _subtype = subtype) att.add_header('Content-Disposition', 'attachment', / filename = self.header(baseName)) att.set_charset(self.CHARSET) self.files.append(att) if not self.SUBJECT: self.SUBJECT = baseName self.fileinfo += '%s/t%s/n' % (self.md5sum(fileName), baseName) def makemail(self): from email.mime.text import MIMEText self.msg['Subject'] = self.header(self.SUBJECT) txt = MIMEText(self.utf8(self.text + self.fileinfo), / 'plain', self.CHARSET) self.msg.attach(txt) for x in self.files: self.msg.attach(x) def utf8(self, data): try: return data.decode(self.CHARSET).encode(self.CHARSET) except: return data.decode('gb18030').encode(self.CHARSET) def header(self, data): '''encode into base64.''' from email.Header import Header return Header(data, self.CHARSET).encode() def md5sum(self, FILE): '''return a file's md5sum.''' from hashlib import md5 BUFSIZE = 1024 m = md5() file = open(FILE, 'r') bytes = file.read(BUFSIZE) while(bytes != b''): m.update(bytes) bytes = file.read(BUFSIZE) file.close() return m.hexdigest() def main(): import sys from optparse import OptionParser from os.path import exists parser = OptionParser(usage = 'Usage: %prog [options] <address>') parser.add_option('-a', dest = 'fileList', action = 'append', / help = 'attach FILE', metavar = 'FILE') parser.add_option('-s', dest = 'subject', action = 'store', / help = 'set SUBJECT', metavar = 'SUBJECT') parser.add_option('-v', dest = 'verbose', action = 'store_true', / help = 'show only,not send') parser.set_defaults(verbose = False) (opts, args) = parser.parse_args() if not opts.fileList and not opts.subject and not args: parser.print_help() sys.exit(1) cf = ConfigFile() From = cf.FROM if not args: mailTo = cf.TO else: mailTo = args[0] mymail = mail(From, mailTo, opts.subject) if opts.fileList: for file in opts.fileList: if exists(file): mymail.addfile(file) mymail.makemail() data = mymail.msg.as_string() if opts.verbose: print(data) else: sendmail(cf.host, cf.port, cf.user, cf.passwd, data) if __name__ == '__main__' : main()