#!/usr/bin/env python import os import sys import getopt import smtplib import email import types VERSION = '0.3' ##### CONFIG ######################################################## DEFAULT_FROM_ADDRESS = None DEFAULT_SMTP_SERVER = 'localhost' ALIASES = {} ##################################################################### def getHostname(): import socket return socket.getfqdn() if os.name == 'posix': def getUserName(): return os.environ['USER'] elif os.name == 'nt' or sys.platform == 'win32': import win32api def getUserName(): return win32api.GetUserName() else: def getUserName(): return 'NONE' class AppConfig: def __init__(self): opts,self.args = getopt.getopt(sys.argv[1:], 'hivVf:S:p:U:P:sa') self.opts={} for key,vl in opts: self.opts[key]=vl def fromaddr(self): if self.opts.get('-f'): return self.opts.get('-f') if DEFAULT_FROM_ADDRESS: return DEFAULT_FROM_ADDRESS return '%s@%s' % (getUserName(), getHostname()) def server(self): if self.opts.get('-S'): return self.opts.get('-S') return DEFAULT_SMTP_SERVER def port(self): return int(self.opts.get('-p','25')) def recipients(self): return self.args def isHelp(self): return self.opts.has_key('-h') def isVersion(self): return self.opts.has_key('-v') def isVerbose(self): return self.opts.has_key('-V') def isExtract(self): return self.opts.has_key('-i') def isSSL(self): return self.opts.has_key('-s') def isAuth(self): return self.opts.has_key('-a') def getusername(self): if self.opts.get('-U'): return self.opts.get('-U') else: getUserName() def getpassword(self): if self.opts.get('-P'): return self.opts.get('-P') else: raise Exception("no password specified") def aliases(self): return ALIASES def listify(data): if data is None : return [] if type(data) == types.ListType: return data return [data] def extractRecipients(msg): """ extract recipient list from e-mail message """ mail = email.message_from_string(msg) to = listify(mail['to']) cc = listify(mail['cc']) bcc = listify(mail['bcc']) return (to+cc+bcc) def processAddresses(cfg, recipients): """ preprocess recipient. used to map aliases, etc """ out = [] for recipient in recipients: if cfg.aliases().has_key(recipient): out.append(cfg.aliases()[recipient]) else: out.append(recipient) return out def sendMessage(cfg, msg): server = smtplib.SMTP(cfg.server(), cfg.port()) if cfg.isVerbose(): server.set_debuglevel(1) #server.debuglevel = 5 # if extract addresses is set only use extracted address. Ignore CLI # and vice versa if cfg.isExtract(): recipients = extractRecipients(msg) else: recipients = cfg.recipients() # update recipient lists to handle aliases and whatnot recipients = processAddresses(cfg, recipients) if cfg.isSSL(): server.ehlo() server.starttls() if cfg.isAuth(): server.ehlo() server.login(cfg.getusername(), cfg.getpassword()) server.sendmail(cfg.fromaddr(), recipients, msg) server.close() def usage(): sys.stderr.write('usage: smtppush.py [ -hivV ] [ -f FROM ] [ -S SMTPSERVER ] [ -p PORT ] RECIPIENT\n') sys.stderr.write(' -f : envelope from address (default can be set in source)\n') sys.stderr.write(' -S : SMTP server to use (default: localhost - override in source)\n') sys.stderr.write(' -p : SMTP server port (default: 25)\n') sys.stderr.write(' -v : display program version\n') sys.stderr.write(' -V : verbose mode\n') sys.stderr.write(' -i : extract recipients from e-mail, ignore recipients on CL\n') sys.stderr.write(' -s : use ssl\n') sys.stderr.write(' -a : use smtp-auth\n') sys.stderr.write(' -U : username for smtp-auth\n') sys.stderr.write(' -P : password for smtp-auth\n') if __name__=='__main__': try: cfg = AppConfig() except: usage() sys.exit(1) if cfg.isHelp(): usage() sys.exit(1) if cfg.isVersion(): print VERSION sys.exit(1) sendMessage(cfg, sys.stdin.read()) sys.exit(0)