#!/usr/bin/python2 import smtplib from time import strftime,ctime from sys import argv import hashlib def parse_file_to_send(filename): try: data = file(filename).read() except IOError: print 'Error in reading file %s' % filename return None try: head,body = data.split('\n\n',1) except: print 'Malformed email: unable to split head and body' return None parameters = {} for headline in head.split('\n'): try: field,value = headline.split(':',1) except: print 'Malformed header line: %s' % headline return None if value.strip() != '': parameters[field] = value.strip() parameters['Message'] = body print 'File OK' return parameters def extract_addresses(address_string): rtn = [] fields = address_string.split(', ') while fields: addr = fields.pop(0) while fields and (1 == addr.count('"') % 2): addr += ', ' + fields.pop(0) if addr: rtn.append(addr) return rtn def send_message( dict_of_fields, Debug=False ): # We expect a dictionary, keys include: # From # To Comma separated list # Subject # Message # Optional # CC Comma separated list # BCC Comma separated list # We insert the date required_fields = [ 'From', 'To', 'Subject' ] for f in required_fields: if f not in dict_of_fields: return 'Require "%s" field' % f if 'Message' not in dict_of_fields: return 'Require "%s" field' % 'Message' possible_fields = [ 'CC', 'BCC', 'MIME-Version' , 'Content-Type', \ 'Content-Transfer-Encoding' , 'Reply-To', \ 'Return-Path', 'Mail-Reply-To', 'Message-ID', \ ] msg_id_hdr = 'Message-ID' if msg_id_hdr not in dict_of_fields: msg_id = '<' msg_id += strftime('%Y%m%d%H%M%S_') msg_id += hashlib.md5(dict_of_fields['Message'].encode('utf-8')).hexdigest()[:8] msg_id += '@solipsys.co.uk' msg_id += '>' dict_of_fields[ msg_id_hdr ] = msg_id for f in possible_fields: if f not in dict_of_fields: dict_of_fields[f] = '' to_addrs = extract_addresses( dict_of_fields['To'] ) to_addrs += extract_addresses( dict_of_fields['CC'] ) to_addrs += extract_addresses( dict_of_fields['BCC'] ) message = '' for f in required_fields: message += '%s: %s\n' % (f,dict_of_fields[f]) for f in possible_fields: if f in dict_of_fields and dict_of_fields[f] != '' and f!='BCC': message += '%s: %s\n' % (f,dict_of_fields[f]) message += strftime('Date: %a, %d %b %Y %H:%M:%S %z\n') message += '\n' message += dict_of_fields['Message'] server_host_name = 'EMAIL_HOST' username = 'USERNAME' password = 'PASSWORD' print 'Sending message' server = smtplib.SMTP(server_host_name,587) server.set_debuglevel(0) server.ehlo() server.starttls() server.ehlo() server.login(username, password) server.sendmail(dict_of_fields['From'], to_addrs, message) server.quit() return 'OK' if __name__=='__main__': Debug = True Debug = False files_sent = False for file_to_send in argv[1:]: parameters = parse_file_to_send(file_to_send) if parameters: print send_message(parameters,Debug) files_sent = True if not files_sent: parameters = { 'Reply-To': 'test_reply@solipsys.co.uk', 'From' : 'test_from@solipsys.co.uk', 'To' : 'test_to@solipsys.co.uk', 'Subject' : 'Test Subject', 'CC' : 'test_cc@solipsys.co.uk', 'BCC' : 'text_bcc@solipsys.co.uk', 'Message' : '', } parameters['Message'] = ''' > 'Reply-To': 'test_reply@solipsys.co.uk', > 'From' : 'test_from@solipsys.co.uk', > 'To' : 'test_to@solipsys.co.uk', > 'Subject' : 'Test Subject', > 'CC' : 'test_cc@solipsys.co.uk', > 'BCC' : 'text_bcc@solipsys.co.uk', ''' print send_message(parameters,Debug)