Changeset 15:8ae771653ffe in mailjam for postman/mta.py
- Timestamp:
- May 21, 2012, 7:22:27 PM (12 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
postman/mta.py
r11 r15 11 11 """ 12 12 13 import sys, email, smtplib13 import os, sys, email, smtplib, xmlrpclib 14 14 from datetime import datetime 15 from models import MailingList 16 import config 15 from postman.models import MailingList 16 from postman.config import MTAClientConfig 17 from postman.tools import validate_email_address 17 18 18 class Sendmail():19 class MTAClient(): 19 20 20 def __init__(self, mailing_list=None, configfile=None): 21 if not isinstance(mailing_list, MailingList): 22 raise ValueError(mailing_list, ' is not a valid mailing list') 23 self.mailing_list = mailing_list 24 self.suscriptors = self.mailing_list.members_addresses 25 self.reply_to = self.mailing_list.address 21 def __init__(self, address=None, configfile=None): 22 if not validate_email_address(address): 23 raise ValueError(address, ' is not a valid email address') 24 25 mta_config = MTAClientConfig() 26 mta_config.load() 27 self.config = mta_config.config 28 self.rpc = xmlrpclib.ServerProxy(self.config['server']['uri']) 29 self.address = self._validate_address(address) 30 self.suscriptors = self.rpc.members.list(address) 31 self.reply_to = self.address 26 32 self.raw_email = None 27 33 self.queue = [] 28 self.archive_config = config.get_config_parameters('archive', 29 configfile) 34 35 def _validate_archive_path(self): 36 """ 37 Validate that the archive path exists. If not, try to create it 38 """ 39 if not os.path.exists(self.config['archive']['path']): 40 # FIXME: This will raise an IOError if the user has no 41 # privileges to create the directory, perhaps we should catch 42 # that and show an error instead 43 os.makedirs(self.config['archive']['path']) 44 return True 30 45 31 def get_raw_email(self): 32 try: 33 self.raw_email = sys.stdin.read() 34 except: 35 raise IOError('Can not get a valid email from stdin') 46 def _validate_address(self, address=None): 47 """ 48 The address provided by the user will be valid only if it is a 49 valid email address and if it is the email address of an already 50 existing mailing list 51 """ 52 if not validate_email_address(address): 53 raise ValueError(address, ' is not a valid email address') 54 if not address in self.rpc.lists.addresses(): 55 raise ValueError(address, 56 ' is not the address of any existing mailing list') 57 # If it is valid, return it 58 return address 59 60 def get_raw_email(self, raw_email=None): 61 """ 62 get the raw data containing email information. If raw_email is None, 63 try to get the data from stdin 64 """ 65 if not raw_email: 66 try: 67 self.raw_email = sys.stdin.read() 68 except: 69 raise IOError('Can not get a valid email from stdin') 70 else: 71 self.raw_email = raw_email 72 # FIXME: We should perform some checks on the raw data, ensuring 73 # it is a valid email text 36 74 return self.raw_email 37 75 … … 40 78 # FIXME: perhaps a while loop here, with some maximum recursion 41 79 # check, would be nice here 42 self.get_raw_email 43 filename = os.path.join(self.archive_config['path'], 80 self.get_raw_email() 81 # Check the path to the archive exists 82 self._validate_archive_path() 83 filename = os.path.join(self.config['archive']['path'], 44 84 datetime.today().strftime('%Y%d%m%H%M%S%f')) 45 85 tmpfile = file(filename, 'w') … … 49 89 50 90 def send_email(self): 91 """ 92 Send emails from the queue, if there is any 93 """ 51 94 if self.queue: 52 95 next_email = self.queue.pop() … … 54 97 email_data = email.message_from_file(email_file) 55 98 email_file.close() 56 57 99 email_data['Reply-to'] = self.reply_to 58 59 smtp_conn = smtplib.SMTP() 60 smtp_conn.connect() 61 smtp_conn.sendmail(email_data['From'], self.suscriptors, 62 email_data.as_string()) 63 smtp_conn.close() 100 print 'SENDING EMAIL:' 101 print email_data 102 #smtp_conn = smtplib.SMTP() 103 #smtp_conn.connect() 104 #smtp_conn.sendmail(email_data['From'], self.suscriptors, 105 # email_data.as_string()) 106 #smtp_conn.close() 107 # FIXME: enable tmp data removal here: 108 # if not self.config['archive']['persistent']: 109 # REMOVE THE FILE FROM DISK 64 110 65 111 def run(self): 66 self.get_raw_email()67 112 self.save_raw_email() 68 113 self.send_email()
Note:
See TracChangeset
for help on using the changeset viewer.