Update of /cvsroot/tmda/tmda/bin
In directory usw-pr-cvs1:/tmp/cvs-serv21645/bin
Modified Files:
ChangeLog tmda-inject tmda-pending tmda-rfilter
Log Message:
Replace use of the rfc822 module with the email module.
The goal of this first revision is simply to replace rfc822, with no
changes in functionality or behavior.
Index: ChangeLog
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/ChangeLog,v
retrieving revision 1.233
retrieving revision 1.234
diff -u -r1.233 -r1.234
--- ChangeLog 21 Sep 2002 00:27:44 -0000 1.233
+++ ChangeLog 30 Sep 2002 23:45:54 -0000 1.234
@@ -1,3 +1,11 @@
+2002-09-30 Jason R. Mastaler <[EMAIL PROTECTED]>
+
+ * tmda-inject: Use the email module instead of the rfc822 module.
+
+ * tmda-pending: Ditto.
+
+ * tmda-rfilter: Ditto.
+
2002-09-20 Jason R. Mastaler <[EMAIL PROTECTED]>
* tmda-pending (main): Run the headers through an RFC 2047 decoder
Index: tmda-inject
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/tmda-inject,v
retrieving revision 1.68
retrieving revision 1.69
diff -u -r1.68 -r1.69
--- tmda-inject 13 Sep 2002 00:22:36 -0000 1.68
+++ tmda-inject 30 Sep 2002 23:45:54 -0000 1.69
@@ -126,7 +126,6 @@
import email
-import rfc822
import string
@@ -138,10 +137,10 @@
Util.filter_match(Defaults.FILTER_OUTGOING, recip, sender)
sys.exit()
-message = sys.stdin
-message_headers = rfc822.Message(message)
-message_body = message.read()
-message_size = str(len(message_body))
+msgout = email.message_from_file(sys.stdin)
+orig_msgout_as_string = msgout.as_string()
+orig_msgout_size = len(orig_msgout_as_string)
+orig_msgout_body_as_raw_string = Util.body_as_raw_string(msgout)
def message_format(fsa, ffn, type):
# "angles" is the default MESSAGE_FROM_STYLE
@@ -197,8 +196,8 @@
to_address,
from_address,
full_name,
- message_headers,
- message_body,
+ msg,
+ orig_msgout_body_as_raw_string,
actions,
log_msg):
"""Hand the message off to sendmail."""
@@ -219,15 +218,17 @@
from_address, to_address)
# Set From: or Resent-From: to match the envelope sender address.
if resending:
- message_headers['Resent-From'] = message_format(resent_from, full_name,
- Defaults.MESSAGE_FROM_STYLE)
+ del msg['Resent-From']
+ msg['Resent-From'] = message_format(resent_from, full_name,
+ Defaults.MESSAGE_FROM_STYLE)
else:
- message_headers['From'] = message_format(magic_from, full_name,
- Defaults.MESSAGE_FROM_STYLE)
+ del msg['From']
+ msg['From'] = message_format(magic_from, full_name,
+ Defaults.MESSAGE_FROM_STYLE)
# If the MUA has added a `Mail-Followup-To' header that contains
# the untagged address, we need to tag that as well.
- if message_headers.has_key('mail-followup-to'):
- mft_list = message_headers.getaddrlist('mail-followup-to')
+ if msg.has_key('mail-followup-to'):
+ mft_list = email.Utils.getaddresses(msg.get_all('mail-followup-to'))
new_mft_list = []
for a in mft_list:
emaddy = a[1]
@@ -235,35 +236,38 @@
new_mft_list.append(magic_from)
else:
new_mft_list.append(emaddy)
- message_headers['Mail-Followup-To'] = string.join(new_mft_list, ',\n\t')
+ del msg['Mail-Followup-To']
+ msg['Mail-Followup-To'] = string.join(new_mft_list, ',\n\t')
# Add `Date' and `Message-ID' headers only if they don't already exist.
- if not message_headers.has_key('date'):
- message_headers['Date'] = Util.make_date()
- if not message_headers.has_key('message-id'):
- message_headers['Message-ID'] = Util.make_msgid()
+ if not msg.has_key('date'):
+ msg['Date'] = Util.make_date()
+ if not msg.has_key('message-id'):
+ msg['Message-ID'] = Util.make_msgid()
# Add `X-Delivery-Agent' header.
- message_headers['X-Delivery-Agent'] = 'TMDA/%s' % Version.TMDA
+ del msg['X-Delivery-Agent']
+ msg['X-Delivery-Agent'] = 'TMDA/%s' % Version.TMDA
# Optionally, add an `X-TMDA-Fingerprint' header.
if Defaults.FINGERPRINT:
hdrlist = []
for hdr in Defaults.FINGERPRINT:
if hdr == 'body':
- hdrval = message_body
+ hdrval = orig_msgout_body_as_raw_string
else:
- hdrval = message_headers.getheader(hdr, None)
+ hdrval = msg.get(hdr)
if hdrval:
hdrlist.append(hdrval)
if hdrlist:
- message_headers['X-TMDA-Fingerprint'] = (Cookie.make_fingerprint
- (hdrlist))
+ del msg['X-TMDA-Fingerprint']
+ msg['X-TMDA-Fingerprint'] = (Cookie.make_fingerprint(hdrlist))
# Optionally, add some headers.
if Defaults.ADDED_HEADERS_CLIENT:
for hdr in Defaults.ADDED_HEADERS_CLIENT.keys():
- message_headers[hdr] = Defaults.ADDED_HEADERS_CLIENT[hdr]
+ del msg[hdr]
+ msg[hdr] = Defaults.ADDED_HEADERS_CLIENT[hdr]
# Optionally, remove some headers.
if Defaults.PURGED_HEADERS:
for hdr in Defaults.PURGED_HEADERS:
- del message_headers[hdr]
+ del msg[hdr]
# Create the custom headers.
custom_headers = [ h for h in actions.keys()
if h not in ('from', 'envelope', 'resent-from') ]
@@ -279,15 +283,14 @@
if Defaults.LOGFILE_OUTGOING:
from TMDA import MessageLogger
logger = MessageLogger.MessageLogger(Defaults.LOGFILE_OUTGOING,
- message_headers,
+ msg,
envsender = envelope_sender,
envrecip = to_address,
- msg_size = message_size,
+ msg_size = orig_msgout_size,
action_msg = log_msg)
logger.write()
# Inject the message.
- Util.sendmail(str(message_headers) + ''.join(nice_headers), message_body,
- to_address, envelope_sender)
+ Util.sendmail(msg.as_string(), to_address, envelope_sender)
######
@@ -300,13 +303,14 @@
actions = None
log_msg = None
- if message_headers.has_key('resent-from'):
+ if msgout.has_key('resent-from'):
# We must be resending (bouncing) the message.
- (fullname, from_address) = message_headers.getaddr('resent-from')
+ fullname, from_address = email.Utils.parseaddr(msgout.get
+ ('resent-from'))
resending = 1
else:
# Use the existing From: header if possible.
- (fullname, from_address) = message_headers.getaddr("from")
+ fullname, from_address = email.Utils.parseaddr(msgout.get('from'))
resending = None
if not fullname:
fullname = Defaults.FULLNAME
@@ -325,44 +329,49 @@
address_list = []
if resending:
# Use Resent-To, Resent-Cc, and Resent-Bcc addresses.
- header_pairs = message_headers.getaddrlist('resent-to') + \
- message_headers.getaddrlist('resent-cc') + \
- message_headers.getaddrlist('resent-bcc')
+ resent_tos = msgout.get_all('resent-to', [])
+ resent_ccs = msgout.get_all('resent-cc', [])
+ resent_bccs = msgout.get_all('resent-bcc', [])
+ header_pairs = email.Utils.getaddresses(resent_tos +
+ resent_ccs +
+ resent_bccs)
else:
# Use To, Cc, Bcc, and Apparently-To addresses.
- header_pairs = message_headers.getaddrlist('to') + \
- message_headers.getaddrlist('cc') + \
- message_headers.getaddrlist('bcc') + \
- message_headers.getaddrlist('apparently-to')
+ tos = msgout.get_all('to', [])
+ ccs = msgout.get_all('cc', [])
+ bccs = msgout.get_all('bcc', [])
+ apparently_tos = msgout.get_all('apparently-to', [])
+ header_pairs = email.Utils.getaddresses(tos + ccs +
+ bccs + apparently_tos)
for pair in header_pairs:
address = pair[1]
address_list.append(address)
# Check for the `X-TMDA' override header.
- if message_headers.has_key('x-tmda'):
+ if msgout.has_key('x-tmda'):
x_tmda_over = 1
- x_tmda = message_headers.getheader('x-tmda')
+ x_tmda = msgout.get('x-tmda')
log_msg = '%s: %s' % ('X-TMDA', x_tmda)
# X-TMDA should only have one field.
if len(string.split(x_tmda)) == 1:
actions = { 'from' : FilterParser.splitaction(x_tmda) }
# Delete `X-TMDA' before sending.
- del message_headers['x-tmda']
- # Optionally, parse subject for `X-TMDA'. e.g,
- # Subject: X-TMDA dated Re: You're fired!
- if (Defaults.X_TMDA_IN_SUBJECT and message_headers.has_key('subject') and
+ del msgout['x-tmda']
+ # Optionally, parse subject for `X-TMDA'.
+ if (Defaults.X_TMDA_IN_SUBJECT and msgout.has_key('subject') and
x_tmda_over is None):
- sub = message_headers.getheader('subject')
+ sub = msgout.get('subject')
subsplit = sub.split(None, 2)
if subsplit and subsplit[0].lower() == 'x-tmda':
x_tmda_over = 1
actions = { 'from' : FilterParser.splitaction(subsplit[1]) }
log_msg = '%s: %s' % ('X-TMDA', subsplit[1])
# Fixup Subject: before sending.
+ del msgout['Subject']
if subsplit[2:]:
- message_headers['Subject'] = subsplit[2:][0]
+ msgout['Subject'] = subsplit[2:][0]
else:
- message_headers['Subject'] = ''
+ msgout['Subject'] = ''
# Without `X-TMDA', we need to parse the outgoing filter file.
if x_tmda_over is None:
outfilter = FilterParser.FilterParser()
@@ -391,8 +400,8 @@
address,
from_address,
fullname,
- message_headers,
- message_body,
+ msgout,
+ orig_msgout_body_as_raw_string,
actions,
log_msg)
if qfilter:
Index: tmda-pending
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/tmda-pending,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- tmda-pending 21 Sep 2002 00:27:44 -0000 1.30
+++ tmda-pending 30 Sep 2002 23:45:54 -0000 1.31
@@ -141,11 +141,9 @@
%(program)s -C -b -s | mail -s 'TMDA pending summary' jason
"""
-import cStringIO
import getopt
import glob
import os
-import rfc822
import sys
import time
@@ -157,6 +155,8 @@
'site-packages', 'TMDA', 'pythonlib')
sys.path.insert(0, sitedir)
+import email
+
from TMDA import Version
@@ -273,29 +273,28 @@
return Cookie.make_confirm_address(recipient, timestamp, pid, 'accept')
-def release(headers, body, msg):
+def release(msgobj, msg):
"""Release a message from the pending queue."""
timestamp, pid, suffix = msg.split('.')
# Remove Return-Path: to avoid duplicates.
- return_path = headers.getaddr('return-path')[1]
- del headers['return-path']
+ return_path = email.Utils.parseaddr(msgobj.get('return-path'))[1]
+ del msgobj['return-path']
# Remove X-TMDA-Recipient:
- recipient = headers.getheader('x-tmda-recipient')
- del headers['x-tmda-recipient']
+ recipient = msgobj.get('x-tmda-recipient')
+ del msgobj['x-tmda-recipient']
# To avoid a mail loop on re-injection, prepend an ``Old-'' prefix
# to all existing Delivered-To lines.
- if headers.has_key('delivered-to'):
- headers.headers = map(lambda h: h.replace('Delivered-To:',
- 'Old-Delivered-To:', 1),
- headers.headers)
+ Util.rename_headers(msgobj, 'Delivered-To', 'Old-Delivered-To')
# Add an X-TMDA-Confirm-Done: field to the top of the header for
# later verification. This includes a timestamp, pid, and HMAC.
- headers['X-TMDA-Confirm-Done'] = Cookie.make_confirm_cookie(timestamp,
- pid, 'done')
+ del msgobj['X-TMDA-Confirm-Done']
+ msgobj['X-TMDA-Confirm-Done'] = Cookie.make_confirm_cookie(timestamp,
+ pid, 'done')
# Add the date when confirmed in a header.
- headers['X-TMDA-Released'] = Util.unixdate()
+ del msgobj['X-TMDA-Released']
+ msgobj['X-TMDA-Released'] = Util.unixdate()
# Reinject the message to the original envelope recipient.
- Util.sendmail(headers, body, recipient, return_path)
+ Util.sendmail(msgobj.as_string(), recipient, return_path)
def main():
@@ -373,16 +372,14 @@
continue
else:
msgcache.insert(0, msg)
- fp = cStringIO.StringIO(open(msg, 'r').read())
- headers = rfc822.Message(fp)
- body = fp.read()
- msg_size = len(body)
+ msgobj = email.message_from_file(open(msg, 'r'))
+ msg_size = len(msgobj.as_string())
bytes = 'bytes'
if msg_size == 1:
bytes = bytes[:-1]
recipient_address = command_recipient
if not recipient_address:
- recipient_address = headers.getheader('x-tmda-recipient')
+ recipient_address = msgobj.get('x-tmda-recipient')
# Pass over the message if it lacks X-TMDA-Recipient and we
# aren't using `-R'.
if not recipient_address:
@@ -398,8 +395,7 @@
for hdr in ('date', 'from', 'to', 'subject'):
print "%s %s: %s" % (' >>',
hdr.capitalize()[:4].rjust(4),
- Util.decode_header(headers.getheader
- (hdr, 'None')))
+ Util.decode_header(msgobj.get(hdr)))
if summary:
print '<mailto:%s>' % (confirm_accept_address
(recipient_address, msg))
@@ -409,14 +405,15 @@
terse_hdrs = []
for hdr in Defaults.TERSE_SUMMARY_HEADERS:
if hdr in ('from_name', 'from_address'):
- from_name, from_address = headers.getaddr('from')
+ from_name, from_address = email.Utils.parseaddr(msgobj.get
+ ('from'))
if hdr == 'from_name':
terse_hdrs.append(from_name
or from_address or 'None')
elif hdr == 'from_address':
terse_hdrs.append(from_address or 'None')
else:
- terse_hdrs.append(headers.getheader(hdr, 'None'))
+ terse_hdrs.append(msgobj.get(hdr))
terse_hdrs.insert(0, msg)
print '\t'.join([Util.decode_header(hdr) for hdr in terse_hdrs])
if interactive:
@@ -459,12 +456,12 @@
cprint(verbose, '\n', message)
if not pretend:
if dispose in ('release', 'delete', 'whitelist', 'blacklist'):
- return_path = headers.getaddr('return-path')[1]
+ return_path = email.Utils.parseaddr(msgobj.get('return-path'))[1]
if dispose == 'release':
if Defaults.PENDING_RELEASE_APPEND:
Util.append_to_file(return_path,
Defaults.PENDING_RELEASE_APPEND)
- release(headers, body, msg)
+ release(msgobj, msg)
elif dispose == 'delete':
if Defaults.PENDING_DELETE_APPEND:
Util.append_to_file(return_path,
Index: tmda-rfilter
===================================================================
RCS file: /cvsroot/tmda/tmda/bin/tmda-rfilter,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- tmda-rfilter 24 Sep 2002 04:19:24 -0000 1.67
+++ tmda-rfilter 30 Sep 2002 23:45:54 -0000 1.68
@@ -123,9 +123,9 @@
from TMDA import Util
-import cStringIO
+from cStringIO import StringIO
+import email
import fileinput
-import rfc822
import string
import time
@@ -142,17 +142,28 @@
mta = MTA.init()
# Read sys.stdin into a temporary variable for later access.
-stdin = cStringIO.StringIO(sys.stdin.read())
+stdin = StringIO(sys.stdin.read())
-# Collect the message headers.
-message_headers = rfc822.Message(stdin)
-# Collect the message body.
-message_body = stdin.read()
-
-# Collect the entire message.
-message = stdin.getvalue()
-# Calculate the message size.
-message_size = str(len(message_body))
+# The incoming message as an email.Message object.
+msgin = email.message_from_file(stdin)
+
+# Original message contents as a string.
+orig_msgin_as_string = msgin.as_string()
+
+# Original message headers as a string.
+orig_msgin_headers_as_string = Util.headers_as_string(msgin)
+
+# Original message headers as a raw string.
+orig_msgin_headers_as_raw_string = Util.headers_as_raw_string(msgin)
+
+# Original message body.
+orig_msgin_body = msgin.get_payload()
+
+# Original message body as a raw string.
+orig_msgin_body_as_raw_string = Util.body_as_raw_string(msgin)
+
+# Calculate the incoming message size.
+orig_msgin_size = len(orig_msgin_as_string)
# Collect the three essential environment variables, and defer if they
# are missing.
@@ -165,7 +176,8 @@
# Use Defaults.RECIPIENT_HEADER instead if set.
recipient_header = None
if Defaults.RECIPIENT_HEADER:
- recipient_header = message_headers.getaddr(Defaults.RECIPIENT_HEADER)[1]
+ recipient_header = email.Utils.parseaddr(msgin.get
+ (Defaults.RECIPIENT_HEADER))[1]
envelope_recipient = (recipient_header or os.environ.get('RECIPIENT'))
if envelope_recipient == None:
raise Errors.MissingEnvironmentVariable('RECIPIENT')
@@ -237,7 +249,7 @@
break
# Collect the message's Subject: for later use.
-subject = message_headers.getheader('subject', 'None')
+subject = msgin.get('subject')
# The directory of pending messages.
pendingdir = os.path.join(Defaults.DATADIR, 'pending')
@@ -257,10 +269,10 @@
action_msg = '%s (no reply)' % action_msg
from TMDA import MessageLogger
logger = MessageLogger.MessageLogger(Defaults.LOGFILE_INCOMING,
- message_headers,
+ msgin,
envsender = envelope_sender,
envrecip = recipient_address,
- msg_size = message_size,
+ msg_size = orig_msgin_size,
action_msg = action_msg)
logger.write()
@@ -300,10 +312,10 @@
'List-Archive', 'Mailing-List', 'X-Mailing-List',
'X-Ml-Name']
for hdr in list_headers:
- if message_headers.has_key(hdr):
- guilty_header = '%s: %s' % (hdr, message_headers.getheader(hdr))
+ if msgin.has_key(hdr):
+ guilty_header = '%s: %s' % (hdr, msgin.get(hdr))
# - header "Precedence:" value junk, bulk, or list
- precedence = message_headers.getheader('precedence', None)
+ precedence = msgin.get('precedence')
if precedence and \
precedence.lower() in ('bulk', 'junk', 'list') and \
guilty_header is None:
@@ -350,34 +362,32 @@
def send_bounce(bounce_message, **vars):
"""Send a confirmation message back to the sender."""
if autorespond_to_sender(envelope_sender) and auto_reply:
- bounce_message = cStringIO.StringIO(bounce_message)
- headers = rfc822.Message(bounce_message)
+ bounce_msg = email.message_from_string(bounce_message)
# Add some headers.
timesecs = time.time()
- headers['Date'] = Util.make_date(timesecs)
- headers['Message-ID'] = Util.make_msgid(timesecs)
+ bounce_msg['Date'] = Util.make_date(timesecs)
+ bounce_msg['Message-ID'] = Util.make_msgid(timesecs)
# References
refs = []
for h in ['references', 'message-id']:
- if message_headers.has_key(h):
- refs = refs + message_headers.getheader(h).split()
+ if msgin.has_key(h):
+ refs = refs + msgin.get(h).split()
if refs:
- headers['References'] = '\n\t'.join(refs)
+ bounce_msg['References'] = '\n\t'.join(refs)
# In-Reply-To
- if message_headers.has_key('message-id'):
- headers['In-Reply-To'] = (
- message_headers.getheader('message-id'))
- headers['To'] = envelope_sender
+ if msgin.has_key('message-id'):
+ bounce_msg['In-Reply-To'] = msgin.get('message-id')
+ bounce_msg['To'] = envelope_sender
if not vars.has_key('already_confirmed'):
- headers['Reply-To'] = vars['confirm_accept_address']
- headers['Precedence'] = 'bulk'
- headers['X-Delivery-Agent'] = 'TMDA/%s' % Version.TMDA
+ bounce_msg['Reply-To'] = vars['confirm_accept_address']
+ bounce_msg['Precedence'] = 'bulk'
+ bounce_msg['X-Delivery-Agent'] = 'TMDA/%s' % Version.TMDA
# Optionally, add some headers.
if Defaults.ADDED_HEADERS_SERVER:
for hdr in Defaults.ADDED_HEADERS_SERVER.keys():
- headers[hdr] = Defaults.ADDED_HEADERS_SERVER[hdr]
- body = bounce_message.read()
- Util.sendmail(headers, body,
+ del bounce_msg[hdr]
+ bounce_msg[hdr] = Defaults.ADDED_HEADERS_SERVER[hdr]
+ Util.sendmail(bounce_msg.as_string(),
envelope_sender, Defaults.BOUNCE_ENV_SENDER)
# Optionally, record this auto-response.
if Defaults.MAX_AUTORESPONSES_PER_DAY != 0:
@@ -394,7 +404,7 @@
def send_cc(address):
"""Send a 'carbon copy' of the message to address."""
- Util.sendmail(message_headers, message_body, address, envelope_sender)
+ Util.sendmail(msgin.as_string(), address, envelope_sender)
logit('CC ' + address)
@@ -409,7 +419,7 @@
mta.stop()
elif action in ('accept', 'deliver', 'ok'):
logit('%s %s' % ('OK', logname))
- mta.deliver(message_headers, message_body)
+ mta.deliver(msgin)
elif action == 'hold':
logit('%s %s' % ('HOLD', logname))
bouncegen('hold')
@@ -418,28 +428,28 @@
bouncegen('request')
-def release_pending(timestamp, pid, headers, body):
+def release_pending(timestamp, pid, msg):
"""Release a confirmed message from the pending queue."""
# Remove Return-Path: to avoid duplicates.
- return_path = headers.getaddr('return-path')[1]
- del headers['return-path']
+ return_path = return_path = email.Utils.parseaddr(msg.get
+ ('return-path'))[1]
+ del msg['return-path']
# Remove X-TMDA-Recipient:
- recipient = headers.getheader('x-tmda-recipient')
- del headers['x-tmda-recipient']
+ recipient = msg.get('x-tmda-recipient')
+ del msg['x-tmda-recipient']
# To avoid a mail loop on re-injection, prepend an ``Old-'' prefix
# to all existing Delivered-To lines.
- if headers.has_key('delivered-to'):
- headers.headers = map(lambda h: h.replace('Delivered-To:',
- 'Old-Delivered-To:', 1),
- headers.headers)
+ Util.rename_headers(msg, 'Delivered-To', 'Old-Delivered-To')
# Add an X-TMDA-Confirm-Done: field to the top of the header for
# later verification. This includes a timestamp, pid, and HMAC.
- headers['X-TMDA-Confirm-Done'] = Cookie.make_confirm_cookie(timestamp,
- pid, 'done')
+ del msg['X-TMDA-Confirm-Done']
+ msg['X-TMDA-Confirm-Done'] = Cookie.make_confirm_cookie(timestamp,
+ pid, 'done')
# Add the date when confirmed in a header.
- headers['X-TMDA-Confirmed'] = Util.unixdate()
+ del msg['X-TMDA-Confirmed']
+ msg['X-TMDA-Confirmed'] = Util.unixdate()
# Reinject the message to the original envelope recipient.
- Util.sendmail(headers, body, recipient, return_path)
+ Util.sendmail(msg.as_string(), recipient, return_path)
mta.stop()
@@ -484,13 +494,10 @@
if Defaults.CONFIRM_ACCEPT_CC:
send_cc(Defaults.CONFIRM_ACCEPT_CC)
if os.path.exists(confirmed_file):
- fp = open(confirmed_file, 'r')
- headers = rfc822.Message(fp)
- body = fp.read()
- fp.close()
+ msg = email.message_from_file(open(confirmed_file, 'r'))
# Optionally append the envelope sender to a file
if Defaults.CONFIRM_APPEND:
- return_path = headers.getaddr('return-path')[1]
+ return_path = email.Utils.parseaddr(msg.get('return-path'))[1]
if return_path is None:
raise IOError, \
confirmed_file + ' has no Return-Path header!'
@@ -521,7 +528,7 @@
break
mta.stop()
# Release the message for delivery if we get this far.
- release_pending(confirm_timestamp, confirm_pid, headers, body)
+ release_pending(confirm_timestamp, confirm_pid, msg)
# post-confirmation
elif confirm_action == 'done':
# Regenerate the HMAC for comparison.
@@ -537,9 +544,9 @@
bouncegen('request')
else:
# Cache and deliver the message.
- if message_headers.has_key('x-tmda-confirmed'):
+ if msgin.has_key('x-tmda-confirmed'):
msgval = 'c'
- elif message_headers.has_key('x-tmda-released'):
+ elif msgin.has_key('x-tmda-released'):
msgval = 'r'
# Record this message in the cache as a dictionary,
# where the message filename is the key, and how it was
@@ -554,8 +561,8 @@
# internally. This won't work when delivering '_qok_',
# since another program (qmail-local) is doing the actual
# writing of the message.
- del message_headers['x-tmda-confirm-done']
- mta.deliver(message_headers, message_body)
+ del msgin['x-tmda-confirm-done']
+ mta.deliver(msgin)
def verify_dated_cookie(dated_cookie):
@@ -577,7 +584,7 @@
if int(cookie_date) >= int('%d' % time.time()):
logit("OK good_dated_cookie (%s)" % \
Util.unixdate(int(cookie_date)))
- mta.deliver(message_headers, message_body)
+ mta.deliver(msgin)
else:
logmsg = "action_expired_dated (%s)" % \
Util.unixdate(int(cookie_date))
@@ -591,7 +598,7 @@
# Accept the message only if the HMAC can be verified.
if (sender_cookie == sender_address_cookie):
logit("OK good_sender_cookie")
- mta.deliver(message_headers, message_body)
+ mta.deliver(msgin)
else:
defact = Defaults.ACTION_FAIL_SENDER.lower()
bouncetext = Defaults.BOUNCE_TEXT_FAIL_SENDER
@@ -607,7 +614,7 @@
# Accept the message only if the HMAC can be verified.
if mac == newmac:
logit("OK good_keyword_cookie \"" + keyword + "\"")
- mta.deliver(message_headers, message_body)
+ mta.deliver(msgin)
else:
defact = Defaults.ACTION_FAIL_KEYWORD.lower()
bouncetext = Defaults.BOUNCE_TEXT_FAIL_KEYWORD
@@ -620,9 +627,10 @@
if not os.path.exists(pendingdir):
os.makedirs(pendingdir, 0700) # stores the unconfirmed messages
# X-TMDA-Recipient is used by release_pending().
- message_headers['X-TMDA-Recipient'] = recipient_address
+ del msgin['X-TMDA-Recipient']
+ msgin['X-TMDA-Recipient'] = recipient_address
# Write ~/.tmda/pending/TIMESTAMP.PID.msg
- pending_contents = str(message_headers) + '\n' + message_body
+ pending_contents = msgin.as_string()
Util.writefile(pending_contents,
os.path.join(pendingdir, pending_message))
return pending_message
@@ -639,9 +647,9 @@
recipient_local, recipient_domain = recipient_address.split('@', 1)
envelope_sender = globals().get('envelope_sender')
subject = globals().get('subject')
- original_message_body = globals().get('message_body')
- original_message_headers = globals().get('message_headers')
- original_message_size = globals().get('message_size')
+ original_message_body = globals().get('orig_msgin_body_as_raw_string')
+ original_message_headers = globals().get('orig_msgin_headers_as_raw_string')
+ original_message_size = globals().get('orig_msgin_size')
# Don't include message bodies over a certain size.
if (Defaults.CONFIRM_MAX_MESSAGE_SIZE and
(int(Defaults.CONFIRM_MAX_MESSAGE_SIZE) < int(original_message_size))):
@@ -649,7 +657,7 @@
% (original_message_headers,
Defaults.CONFIRM_MAX_MESSAGE_SIZE)
else:
- original_message = globals().get('message')
+ original_message = globals().get('orig_msgin_as_string')
# Optional 'dated' address variables.
if Defaults.DATED_TEMPLATE_VARS:
dated_timeout = Util.format_timeout(Defaults.TIMEOUT)
@@ -723,15 +731,15 @@
# The list of sender e-mail addresses comes from the envelope
# sender, the "From:" header and the "Reply-To:" header.
sender_list = [envelope_sender]
- from_list = message_headers.getaddrlist("from")
- replyto_list = message_headers.getaddrlist("reply-to")
- for list in from_list,replyto_list:
+ from_list = email.Utils.getaddresses(msgin.get_all('from', []))
+ replyto_list = email.Utils.getaddresses(msgin.get_all('reply-to', []))
+ for list in from_list, replyto_list:
for a in list:
emaddy = a[1]
sender_list.append(emaddy)
# Process confirmation messages first.
- confirm_done_hdr = message_headers.getheader('x-tmda-confirm-done', None)
+ confirm_done_hdr = msgin.get('x-tmda-confirm-done')
if confirm_done_hdr:
verify_confirm_cookie(confirm_done_hdr, 'done')
if (cookie_type in Defaults.TAGS_CONFIRM) and cookie_value:
@@ -740,11 +748,11 @@
# Parse the incoming filter file.
infilter = FilterParser.FilterParser()
infilter.read(Defaults.FILTER_INCOMING)
- (actions,matching_line) = infilter.firstmatch(recipient_address,
- sender_list,
- message_body,
- str(message_headers),
- message_size)
+ (actions, matching_line) = infilter.firstmatch(recipient_address,
+ sender_list,
+ orig_msgin_body_as_raw_string,
+ orig_msgin_headers_as_raw_string,
+ orig_msgin_size)
(action, option) = actions.get('incoming', (None, None))
# Dispose of the message now if there was a filter file match.
# Log the action along with and the matching line in the filter
@@ -762,10 +770,10 @@
elif action in ('accept','deliver','ok'):
if option:
logit('%s (%s)' % ('DELIVER', matching_line + '=' + option))
- mta.deliver(message_headers, message_body, option)
+ mta.deliver(msgin, option)
else:
logit('%s (%s)' % ('OK', matching_line))
- mta.deliver(message_headers, message_body)
+ mta.deliver(msgin)
elif action == 'confirm':
logit('%s (%s)' % ('CONFIRM', matching_line))
bouncegen('request')
@@ -784,7 +792,7 @@
elif (cookie_type in map(lambda s: s.lower(), Defaults.TAGS_SENDER)) \
and cookie_value:
sender_address = globals().get('envelope_sender')
- verify_sender_cookie(sender_address,cookie_value)
+ verify_sender_cookie(sender_address, cookie_value)
# Keyword tag?
elif (cookie_type in map(lambda s: s.lower(), Defaults.TAGS_KEYWORD)) \
and cookie_value:
_______________________________________
tmda-cvs mailing list
http://tmda.net/lists/listinfo/tmda-cvs