summaryrefslogtreecommitdiffstats
path: root/Tools/scripts/mailerdaemon.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1998-03-24 05:30:29 (GMT)
committerGuido van Rossum <guido@python.org>1998-03-24 05:30:29 (GMT)
commited5b3d8b3c8077c8c57c8a825cae06e319b0994d (patch)
treef200df16bbb012dcfe74b75a990c32709e80f44a /Tools/scripts/mailerdaemon.py
parent3db0e3713cd59d1c922002056f11ae5caf02805c (diff)
downloadcpython-ed5b3d8b3c8077c8c57c8a825cae06e319b0994d.zip
cpython-ed5b3d8b3c8077c8c57c8a825cae06e319b0994d.tar.gz
cpython-ed5b3d8b3c8077c8c57c8a825cae06e319b0994d.tar.bz2
give in to tab police
Diffstat (limited to 'Tools/scripts/mailerdaemon.py')
-rwxr-xr-xTools/scripts/mailerdaemon.py450
1 files changed, 226 insertions, 224 deletions
diff --git a/Tools/scripts/mailerdaemon.py b/Tools/scripts/mailerdaemon.py
index f2e8ac4..c065eb2 100755
--- a/Tools/scripts/mailerdaemon.py
+++ b/Tools/scripts/mailerdaemon.py
@@ -11,264 +11,266 @@ Unparseable = 'mailerdaemon.Unparseable'
class ErrorMessage(rfc822.Message):
def __init__(self, fp):
- rfc822.Message.__init__(self, fp)
+ rfc822.Message.__init__(self, fp)
def is_warning(self):
- sub = self.getheader('Subject')
- if not sub:
- return 0
- sub = string.lower(sub)
- if sub[:12] == 'waiting mail': return 1
- if string.find(sub, 'warning') >= 0: return 1
- self.sub = sub
- return 0
+ sub = self.getheader('Subject')
+ if not sub:
+ return 0
+ sub = string.lower(sub)
+ if sub[:12] == 'waiting mail': return 1
+ if string.find(sub, 'warning') >= 0: return 1
+ self.sub = sub
+ return 0
def get_errors(self):
- for p in EMPARSERS:
- self.rewindbody()
- try:
- return p(self.fp, self.sub)
- except Unparseable:
- pass
- raise Unparseable
+ for p in EMPARSERS:
+ self.rewindbody()
+ try:
+ return p(self.fp, self.sub)
+ except Unparseable:
+ pass
+ raise Unparseable
sendmail_pattern = regex.compile('[0-9][0-9][0-9] ')
def emparse_sendmail(fp, sub):
while 1:
- line = fp.readline()
- if not line:
- raise Unparseable
- line = line[:-1]
+ line = fp.readline()
+ if not line:
+ raise Unparseable
+ line = line[:-1]
- # Check that we're not in the returned message yet
- if string.lower(line)[:5] == 'from:':
- raise Unparseable
- line = string.split(line)
- if len(line) > 3 and \
- ((line[0] == '-----' and line[1] == 'Transcript') or
- (line[0] == '---' and line[1] == 'The' and
- line[2] == 'transcript') or
- (line[0] == 'While' and line[1] == 'talking' and line[2] == 'to')):
- # Yes, found it!
- break
+ # Check that we're not in the returned message yet
+ if string.lower(line)[:5] == 'from:':
+ raise Unparseable
+ line = string.split(line)
+ if len(line) > 3 and \
+ ((line[0] == '-----' and line[1] == 'Transcript') or
+ (line[0] == '---' and line[1] == 'The' and
+ line[2] == 'transcript') or
+ (line[0] == 'While' and
+ line[1] == 'talking' and
+ line[2] == 'to')):
+ # Yes, found it!
+ break
errors = []
found_a_line = 0
warnings = 0
while 1:
- line = fp.readline()
- if not line:
- break
- line = line[:-1]
- if not line:
- continue
- if sendmail_pattern.match(line) == 4:
- # Yes, an error/warning line. Ignore 4, remember 5, stop on rest
- if line[0] == '5':
- errors.append(line)
- elif line[0] == '4':
- warnings = 1
- else:
- raise Unparseable
- line = string.split(line)
- if line and line[0][:3] == '---':
- break
- found_a_line = 1
+ line = fp.readline()
+ if not line:
+ break
+ line = line[:-1]
+ if not line:
+ continue
+ if sendmail_pattern.match(line) == 4:
+ # Yes, an error/warning line. Ignore 4, remember 5, stop on rest
+ if line[0] == '5':
+ errors.append(line)
+ elif line[0] == '4':
+ warnings = 1
+ else:
+ raise Unparseable
+ line = string.split(line)
+ if line and line[0][:3] == '---':
+ break
+ found_a_line = 1
# special case for CWI sendmail
if len(line) > 1 and line[1] == 'Undelivered':
- while 1:
- line = fp.readline()
- if not line:
- break
- line = string.strip(line)
- if not line:
- break
- errors.append(line + ': ' + sub)
+ while 1:
+ line = fp.readline()
+ if not line:
+ break
+ line = string.strip(line)
+ if not line:
+ break
+ errors.append(line + ': ' + sub)
# Empty transcripts are ok, others without an error are not.
if found_a_line and not (errors or warnings):
- raise Unparseable
+ raise Unparseable
return errors
def emparse_cts(fp, sub):
while 1:
- line = fp.readline()
- if not line:
- raise Unparseable
- line = line[:-1]
+ line = fp.readline()
+ if not line:
+ raise Unparseable
+ line = line[:-1]
- # Check that we're not in the returned message yet
- if string.lower(line)[:5] == 'from:':
- raise Unparseable
- line = string.split(line)
- if len(line) > 3 and line[0][:2] == '|-' and line[1] == 'Failed' \
- and line[2] == 'addresses':
- # Yes, found it!
- break
+ # Check that we're not in the returned message yet
+ if string.lower(line)[:5] == 'from:':
+ raise Unparseable
+ line = string.split(line)
+ if len(line) > 3 and line[0][:2] == '|-' and line[1] == 'Failed' \
+ and line[2] == 'addresses':
+ # Yes, found it!
+ break
errors = []
while 1:
- line = fp.readline()
- if not line:
- break
- line = line[:-1]
- if not line:
- continue
- if line[:2] == '|-':
- break
- errors.append(line)
+ line = fp.readline()
+ if not line:
+ break
+ line = line[:-1]
+ if not line:
+ continue
+ if line[:2] == '|-':
+ break
+ errors.append(line)
return errors
def emparse_aol(fp, sub):
while 1:
- line = fp.readline()
- if not line:
- raise Unparseable
- line = line[:-1]
- if line:
- break
+ line = fp.readline()
+ if not line:
+ raise Unparseable
+ line = line[:-1]
+ if line:
+ break
exp = 'The mail you sent could not be delivered to:'
if line[:len(exp)] != exp:
- raise Unparseable
+ raise Unparseable
errors = []
while 1:
- line = fp.readline()
- if sendmail_pattern.match(line) == 4:
- # Yes, an error/warning line. Ignore 4, remember 5, stop on rest
- if line[0] == '5':
- errors.append(line)
- elif line[0] != '4':
- raise Unparseable
- elif line == '\n':
- break
- else:
- raise Unparseable
+ line = fp.readline()
+ if sendmail_pattern.match(line) == 4:
+ # Yes, an error/warning line. Ignore 4, remember 5, stop on rest
+ if line[0] == '5':
+ errors.append(line)
+ elif line[0] != '4':
+ raise Unparseable
+ elif line == '\n':
+ break
+ else:
+ raise Unparseable
return errors
def emparse_compuserve(fp, sub):
while 1:
- line = fp.readline()
- if not line:
- raise Unparseable
- line = line[:-1]
- if line:
- break
+ line = fp.readline()
+ if not line:
+ raise Unparseable
+ line = line[:-1]
+ if line:
+ break
exp = 'Your message could not be delivered for the following reason:'
if line[:len(exp)] != exp:
- raise Unparseable
+ raise Unparseable
errors = []
while 1:
- line = fp.readline()
- if not line: break
- if line[:3] == '---': break
- line = line[:-1]
- if not line: continue
- if line == 'Please resend your message at a later time.':
- continue
- line = 'Compuserve: ' + line
- errors.append(line)
+ line = fp.readline()
+ if not line: break
+ if line[:3] == '---': break
+ line = line[:-1]
+ if not line: continue
+ if line == 'Please resend your message at a later time.':
+ continue
+ line = 'Compuserve: ' + line
+ errors.append(line)
return errors
prov_pattern = regex.compile('.* | \(.*\)')
def emparse_providence(fp, sub):
while 1:
- line = fp.readline()
- if not line:
- raise Unparseable
- line = line[:-1]
+ line = fp.readline()
+ if not line:
+ raise Unparseable
+ line = line[:-1]
- # Check that we're not in the returned message yet
- if string.lower(line)[:5] == 'from:':
- raise Unparseable
- exp = 'The following errors occurred'
- if line[:len(exp)] == exp:
- break
+ # Check that we're not in the returned message yet
+ if string.lower(line)[:5] == 'from:':
+ raise Unparseable
+ exp = 'The following errors occurred'
+ if line[:len(exp)] == exp:
+ break
errors = []
while 1:
- line = fp.readline()
- if not line:
- break
- line = line[:-1]
- if not line:
- continue
- if line[:4] == '----':
- break
- if prov_pattern.match(line) > 0:
- errors.append(prov_pattern.group(1))
+ line = fp.readline()
+ if not line:
+ break
+ line = line[:-1]
+ if not line:
+ continue
+ if line[:4] == '----':
+ break
+ if prov_pattern.match(line) > 0:
+ errors.append(prov_pattern.group(1))
if not errors:
- raise Unparseable
+ raise Unparseable
return errors
def emparse_x400(fp, sub):
exp = 'This report relates to your message:'
while 1:
- line = fp.readline()
- if not line:
- raise Unparseable
- line = line[:-1]
+ line = fp.readline()
+ if not line:
+ raise Unparseable
+ line = line[:-1]
- # Check that we're not in the returned message yet
- if string.lower(line)[:5] == 'from:':
- raise Unparseable
- if line[:len(exp)] == exp:
- break
+ # Check that we're not in the returned message yet
+ if string.lower(line)[:5] == 'from:':
+ raise Unparseable
+ if line[:len(exp)] == exp:
+ break
errors = []
exp = 'Your message was not delivered to'
while 1:
- line = fp.readline()
- if not line:
- break
- line = line[:-1]
- if not line:
- continue
- if line[:len(exp)] == exp:
- error = string.strip(line[len(exp):])
- sep = ': '
- while 1:
- line = fp.readline()
- if not line:
- break
- line = line[:-1]
- if not line:
- break
- if line[0] == ' ' and line[-1] != ':':
- error = error + sep + string.strip(line)
- sep = '; '
- errors.append(error)
- return errors
+ line = fp.readline()
+ if not line:
+ break
+ line = line[:-1]
+ if not line:
+ continue
+ if line[:len(exp)] == exp:
+ error = string.strip(line[len(exp):])
+ sep = ': '
+ while 1:
+ line = fp.readline()
+ if not line:
+ break
+ line = line[:-1]
+ if not line:
+ break
+ if line[0] == ' ' and line[-1] != ':':
+ error = error + sep + string.strip(line)
+ sep = '; '
+ errors.append(error)
+ return errors
raise Unparseable
def emparse_passau(fp, sub):
exp = 'Unable to deliver message because'
while 1:
- line = fp.readline()
- if not line:
- raise Unparseable
- if string.lower(line)[:5] == 'from:':
- raise Unparseable
- if line[:len(exp)] == exp:
- break
+ line = fp.readline()
+ if not line:
+ raise Unparseable
+ if string.lower(line)[:5] == 'from:':
+ raise Unparseable
+ if line[:len(exp)] == exp:
+ break
errors = []
exp = 'Returned Text follows'
while 1:
- line = fp.readline()
- if not line:
- raise Unparseable
- line = line[:-1]
- # Check that we're not in the returned message yet
- if string.lower(line)[:5] == 'from:':
- raise Unparseable
- if not line:
- continue
- if line[:len(exp)] == exp:
- return errors
- errors.append(string.strip(line))
+ line = fp.readline()
+ if not line:
+ raise Unparseable
+ line = line[:-1]
+ # Check that we're not in the returned message yet
+ if string.lower(line)[:5] == 'from:':
+ raise Unparseable
+ if not line:
+ continue
+ if line[:len(exp)] == exp:
+ return errors
+ errors.append(string.strip(line))
EMPARSERS = [emparse_sendmail, emparse_aol, emparse_cts, emparse_compuserve,
- emparse_providence, emparse_x400, emparse_passau]
+ emparse_providence, emparse_x400, emparse_passau]
def sort_numeric(a, b):
a = string.atoi(a)
@@ -290,62 +292,62 @@ def parsedir(dir, modify):
files.sort(sort_numeric)
for fn in files:
- # Lets try to parse the file.
- fp = open(fn)
- m = ErrorMessage(fp)
- sender = m.getaddr('From')
- print '%s\t%-40s\t'%(fn, sender[1]),
+ # Lets try to parse the file.
+ fp = open(fn)
+ m = ErrorMessage(fp)
+ sender = m.getaddr('From')
+ print '%s\t%-40s\t'%(fn, sender[1]),
- if m.is_warning():
- print 'warning only'
- nwarn = nwarn + 1
- if modify:
- os.unlink(fn)
- continue
+ if m.is_warning():
+ print 'warning only'
+ nwarn = nwarn + 1
+ if modify:
+ os.unlink(fn)
+ continue
- try:
- errors = m.get_errors()
- except Unparseable:
- print '** Not parseable'
- nbad = nbad + 1
- continue
- print len(errors), 'errors'
+ try:
+ errors = m.get_errors()
+ except Unparseable:
+ print '** Not parseable'
+ nbad = nbad + 1
+ continue
+ print len(errors), 'errors'
- # Remember them
- for e in errors:
- try:
- mm, dd = m.getdate('date')[1:1+2]
- date = '%s %02d' % (calendar.month_abbr[mm], dd)
- except:
- date = '??????'
- if not errordict.has_key(e):
- errordict[e] = 1
- errorfirst[e] = '%s (%s)' % (fn, date)
- else:
- errordict[e] = errordict[e] + 1
- errorlast[e] = '%s (%s)' % (fn, date)
+ # Remember them
+ for e in errors:
+ try:
+ mm, dd = m.getdate('date')[1:1+2]
+ date = '%s %02d' % (calendar.month_abbr[mm], dd)
+ except:
+ date = '??????'
+ if not errordict.has_key(e):
+ errordict[e] = 1
+ errorfirst[e] = '%s (%s)' % (fn, date)
+ else:
+ errordict[e] = errordict[e] + 1
+ errorlast[e] = '%s (%s)' % (fn, date)
- nok = nok + 1
- if modify:
- os.unlink(fn)
+ nok = nok + 1
+ if modify:
+ os.unlink(fn)
print '--------------'
print nok, 'files parsed,',nwarn,'files warning-only,',
print nbad,'files unparseable'
print '--------------'
for e in errordict.keys():
- print errordict[e], errorfirst[e], '-', errorlast[e], '\t', e
+ print errordict[e], errorfirst[e], '-', errorlast[e], '\t', e
def main():
modify = 0
if len(sys.argv) > 1 and sys.argv[1] == '-d':
- modify = 1
- del sys.argv[1]
+ modify = 1
+ del sys.argv[1]
if len(sys.argv) > 1:
- for folder in sys.argv[1:]:
- parsedir(folder, modify)
+ for folder in sys.argv[1:]:
+ parsedir(folder, modify)
else:
- parsedir('/ufs/jack/Mail/errorsinbox', modify)
+ parsedir('/ufs/jack/Mail/errorsinbox', modify)
if __name__ == '__main__' or sys.argv[0] == __name__:
main()