source: mailjam/postman/mta.py@ 15:8ae771653ffe

Last change on this file since 15:8ae771653ffe was 15:8ae771653ffe, checked in by Borja Lopez <borja@…>, 12 years ago

Added a postman-mta.conf version to be used in the tests

Added a script bin/postman-mta that will run the MTA client from a shell

Renamed the bin/postman_server script to bin/postman-server

Disabled the tests from tests/mta.py, as they are totally outdated and they
break the tests.

Replaced the old code in mta.Sendmail with a new mta.MTAClient class, which
contains code that actually *works* against a postman server (tests to come!)

Restructured the postman-mta.conf configuration file. The sections have better
names now (server, archive) and the archive section contains parameters which
names that reflect much better what they are used for.

Added a new parameter to the postman-mta.conf file (server.uri) that allows
us to set the uri to where any MTA client will have to connect, in only one
shorter line.

Fixed some typos in postman.config

Updated the setup.py script so the bin/postman-* scripts are installed
properly in the bin/ directory.

Added a function, proper_etc_path(), to the setup.py script so the path where
configuration files have to be installed is correctly set when building a
distribution/source package (still to be tested).

Updated the MANIFEST

File size: 4.0 KB
Line 
1# -*- coding: utf-8 -*-
2
3"""
4The postman project - mta.py
5
6This file is released under the BSD license, see LICENSE for
7more information.
8
9Francisco de Borja Lopez Rio - <borja@codigo23.net>
10Soluciones Informaticas Codigo23 S.L.U. - http://codigo23.net
11"""
12
13import os, sys, email, smtplib, xmlrpclib
14from datetime import datetime
15from postman.models import MailingList
16from postman.config import MTAClientConfig
17from postman.tools import validate_email_address
18
19class MTAClient():
20
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
32 self.raw_email = None
33 self.queue = []
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
45
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
74 return self.raw_email
75
76 def save_raw_email(self):
77 if not self.raw_email:
78 # FIXME: perhaps a while loop here, with some maximum recursion
79 # check, would be nice here
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'],
84 datetime.today().strftime('%Y%d%m%H%M%S%f'))
85 tmpfile = file(filename, 'w')
86 tmpfile.write(self.raw_email)
87 tmpfile.close()
88 self.queue.append(filename)
89
90 def send_email(self):
91 """
92 Send emails from the queue, if there is any
93 """
94 if self.queue:
95 next_email = self.queue.pop()
96 email_file = file(next_email, 'r')
97 email_data = email.message_from_file(email_file)
98 email_file.close()
99 email_data['Reply-to'] = self.reply_to
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
110
111 def run(self):
112 self.save_raw_email()
113 self.send_email()
Note: See TracBrowser for help on using the repository browser.