[Zope] ZMailIn patch
Jean Jordaan
jean@upfrontsystems.co.za
Fri, 7 Jun 2002 15:59:38 +0200
This is a multi-part message in MIME format.
------=_NextPart_000_01BD_01C20E3C.538A89D0
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Hi there
I've modified zopeMailIn.py to look for a client based on firstly the
recipient fields, and secondly the 'cc' and 'bcc' fields (so that I
can copy Zope on a mail I'm sending to a client, for example). I'm
sending on the diff against ZMailIn-1_0_0 in case it's of interest ..
--
Jean Jordaan
Upfront Systems http://www.upfrontsystems.co.za
------=_NextPart_000_01BD_01C20E3C.538A89D0
Content-Type: application/octet-stream;
name="zopeMailIn.py.diff"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="zopeMailIn.py.diff"
--- =
/usr/local/upfront/library/software/zope/products/ZMailIn/zopeMailIn.py =
Mon Feb 11 18:56:25 2002=0A=
+++ zopeMailIn.py Fri Jun 7 15:38:00 2002=0A=
@@ -1,4 +1,4 @@=0A=
-#!/usr/bin/python=0A=
+#!/usr/bin/python2.1=0A=
=0A=
# This python module will send a mail message to a zope instance that =
has the relevent=0A=
# ZMailIn client present.=0A=
@@ -12,6 +12,7 @@=0A=
=0A=
def GetLocationHTTP(host, emailaddress):=0A=
# Attempt to get the location of the ZMailIn client for the =
given email address=0A=
+=0A=
try:=0A=
returned =3D urllib.urlopen(host, =
urllib.urlencode({'email_address':emailaddress})).read()=0A=
except IOError,e:=0A=
@@ -21,68 +22,101 @@=0A=
=0A=
def _make_url(host=3DzopeMailInConf.host, path=3D''):=0A=
user_and_pass=3D''=0A=
- =0A=
+=0A=
if zopeMailInConf.username and zopeMailInConf.password:=0A=
=
user_and_pass=3D"%s:%s@"%(zopeMailInConf.username,zopeMailInConf.password=
)=0A=
- =0A=
+=0A=
return host[:7] + user_and_pass + host[7:] + path=0A=
=0A=
+=0A=
if __name__ =3D=3D '__main__':=0A=
# This gets called by the MTA when a new message arrives.=0A=
# The mail message file gets passed in on the stdin=0A=
- =0A=
+=0A=
f =3D sys.stdin # First get a handle on the message file=0A=
messageText =3D f.read()=0A=
- =0A=
+=0A=
url =3D ''=0A=
if len(sys.argv)>1:=0A=
url =3D sys.argv[1]=0A=
- =0A=
+=0A=
if not url:=0A=
# get a url=0A=
mf =3D rfc822.Message(StringIO.StringIO(messageText))=0A=
- messageTo =3D mf.get('envelope-to',mf.get('to',''))=0A=
- if not messageTo:=0A=
- print "ZMailIn Error: No 'envelope-to' or 'to' =
header in message"=0A=
+ # rcc: this is not very resilient=0A=
+ # njj: it'll fail if either of these headers contain=0A=
+ # multiple addresses. Use mail objects' 'getaddr' method=0A=
+ # instead of list subscription.=0A=
+ # messageTo =3D mf.get('envelope-to',mf.get('to',''))=0A=
+ #=0A=
+ # Check for recipient first ('envelope-to', then 'to');=0A=
+ # then for cc ('cc', then 'bcc'). Then look for a=0A=
+ # ZMailIn Client: if not 'recipient_client', look for=0A=
+ # 'cc_client'.=0A=
+ #=0A=
+ name, recipient_client =3D mf.getaddr('envelope-to')=0A=
+ if not recipient_client:=0A=
+ name, recipient_client =3D mf.getaddr('to')=0A=
+ name, cc_client =3D mf.getaddr('cc')=0A=
+ if not cc_client:=0A=
+ name, cc_client =3D mf.getaddr('bcc')=0A=
+=0A=
+ if (not recipient_client) and (not cc_client):=0A=
+ print "ZMailIn Error: No 'envelope-to', 'to', =
'cc' or 'bcc' header in message"=0A=
sys.exit(1)=0A=
- =0A=
+=0A=
host =3D _make_url(path=3D'getZMailInClientLocation')=0A=
=0A=
- # Try to get the exact email address=0A=
- url =3D GetLocationHTTP(host, messageTo)=0A=
- =0A=
- if url[:4]=3D=3D'FAIL':=0A=
+=0A=
+ for client_address in [recipient_client, cc_client]:=0A=
+ if not client_address: continue=0A=
+=0A=
+ # Try to get the exact email address=0A=
+ url =3D GetLocationHTTP(host, client_address)=0A=
+=0A=
+ if url[:4]=3D=3D'FAIL':=0A=
print "ZMailIn Error:",url=0A=
- sys.exit(1)=0A=
- =0A=
- if url=3D=3D'Not Found':=0A=
- # We didn't get the exact email address so try =
for a domain match only=0A=
- domain =3D =
messageTo[string.rfind(messageTo,'@'):]=0A=
+ # sys.exit(1)=0A=
+ url =3D None=0A=
+=0A=
+ elif url=3D=3D'Not Found':=0A=
+ # We didn't get the exact email address so try =
for a=0A=
+ # domain match only=0A=
+ domain =3D client_address[=0A=
+ string.rfind(client_address,'@'):]=0A=
url =3D GetLocationHTTP(host, domain)=0A=
- =0A=
- if url=3D=3D'Not Found' or '\n' in url:=0A=
- print "ZMailIn Error: ZMailIn Client does not =
exist"=0A=
- sys.exit(1)=0A=
- =0A=
- url =3D _make_url(url)=0A=
+=0A=
+ if url=3D=3D'Not Found' or '\n' in url:=0A=
+ print "ZMailIn Error: ZMailIn Client does =
not exist %s"%client_address=0A=
+ # sys.exit(1)=0A=
+ url =3D None=0A=
+=0A=
+ if url: break # OK, we've found one, stop looking.=0A=
+=0A=
+ if url:=0A=
+ url =3D _make_url(url)=0A=
+ print "Found client at %s"%url=0A=
+ else:=0A=
+ sys.exit(1)=0A=
+=0A=
=0A=
if url:=0A=
- =0A=
+=0A=
url =3D url + '/postZMailMessage'=0A=
try:=0A=
result =3D urllib.urlopen(url, =
urllib.urlencode({'file':messageText})).read()=0A=
except (IOError,EOFError),e:=0A=
print "ZMailIn Error: Problem Connecting to =
server",e=0A=
sys.exit(73)=0A=
- =0A=
+=0A=
# if the ZMailIn Client's method returned anything, =
then 'something bad' happened.=0A=
if result:=0A=
print result=0A=
sys.exit(1)=0A=
- =0A=
+=0A=
sys.exit(0)=0A=
=0A=
print "ZMailIn Error: No ZMailIn Client URL found or specified."=0A=
sys.exit(1)=0A=
- =0A=
- =0A=
+=0A=
+=0A=
------=_NextPart_000_01BD_01C20E3C.538A89D0--