Skip to content

Commit 4d11869

Browse files
author
Richard Jones
committed
roundup-mailgw now logs fatal exceptions rather than mailing them to admin
1 parent 639287c commit 4d11869

File tree

3 files changed

+39
-39
lines changed

3 files changed

+39
-39
lines changed

CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Feature:
99
- remove "manual" locking of sqlite database
1010
- create a new RDBMS cursor after committing
1111
- added basic logging, and configuration of it and python's logging module
12+
- roundup-mailgw now logs fatal exceptions rather than mailing them to admin
1213
- add a default argument to the DateHTMLProperty.field method, and an
1314
optional Interval (string or object) to the DateHTMLProperty.now (patch
1415
from Vickenty Fesunov)
@@ -23,6 +24,7 @@ Fixed:
2324
- fix anydbm journal import (sf bug 983166)
2425
- handle postgresql bug in SQL generation (sf bug 984591)
2526
- fix dates-from-Dates (sf bug 984604)
27+
- fix messageid generated when msgid is None for send_message (sf bug 987933)
2628

2729

2830
2004-06-24 0.7.5

roundup/hyperdb.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# BASIS, AND THERE IS NO OBLIGATION WHATSOEVER TO PROVIDE MAINTENANCE,
1616
# SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
1717
#
18-
# $Id: hyperdb.py,v 1.100 2004-07-02 05:22:08 richard Exp $
18+
# $Id: hyperdb.py,v 1.101 2004-07-14 01:12:25 richard Exp $
1919

2020
"""Hyperdatabase implementation, especially field types.
2121
"""
@@ -562,7 +562,7 @@ def safeget(self, nodeid, propname, default=None):
562562
try:
563563
return self.get(nodeid, propname)
564564
except IndexError:
565-
return default
565+
return default
566566

567567
def export_propnames(self):
568568
'''List the property names for export from this Class.'''

roundup/mailgw.py

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class node. Any parts of other types are each stored in separate files
7474
an exception, the original message is bounced back to the sender with the
7575
explanatory message given in the exception.
7676
77-
$Id: mailgw.py,v 1.150 2004-05-25 00:43:01 richard Exp $
77+
$Id: mailgw.py,v 1.151 2004-07-14 01:12:25 richard Exp $
7878
"""
7979
__docformat__ = 'restructuredtext'
8080

@@ -318,6 +318,7 @@ def __init__(self, instance, db, arguments={}):
318318
self.db = db
319319
self.arguments = arguments
320320
self.mailer = Mailer(instance.config)
321+
self.logger = instance.config.logging.getLogger('mailgw')
321322

322323
# should we trap exceptions (normal usage) or pass them through
323324
# (for testing)
@@ -386,25 +387,19 @@ def do_imap(self, server, user='', password='', mailbox='', ssl=0):
386387
# open a connection to the server and retrieve all messages
387388
try:
388389
if ssl:
389-
print 'Trying server "%s" with ssl' % server
390+
self.logger.debug('Trying server %r with ssl'%server)
390391
server = imaplib.IMAP4_SSL(server)
391392
else:
392-
print 'Trying server %s without ssl' % server
393+
self.logger.debug('Trying server %r without ssl'%server)
393394
server = imaplib.IMAP4(server)
394-
except imaplib.IMAP4.error, e:
395-
print 'IMAP server error:', e
396-
return 1
397-
except socket.error, e:
398-
print 'SOCKET error:', e
399-
return 1
400-
except socket.sslerror, e:
401-
print 'SOCKET ssl error:', e
395+
except (imaplib.IMAP4.error, socket.error, socket.sslerror):
396+
self.logger.exception('IMAP server error')
402397
return 1
403398

404399
try:
405400
server.login(user, password)
406401
except imaplib.IMAP4.error, e:
407-
print 'Login failure:', e
402+
self.logger.exception('IMAP login failure')
408403
return 1
409404

410405
try:
@@ -413,12 +408,14 @@ def do_imap(self, server, user='', password='', mailbox='', ssl=0):
413408
else:
414409
(typ, data) = server.select(mailbox=mailbox)
415410
if typ != 'OK':
416-
print 'Failed to get mailbox "%s": %s'%(mailbox, data)
411+
self.logger.error('Failed to get mailbox %r: %s'%(mailbox,
412+
data))
417413
return 1
418414
try:
419415
numMessages = int(data[0])
420416
except ValueError, value:
421-
print 'Invalid message count from mailbox %r'%data[0]
417+
self.logger.error('Invalid message count from mailbox %r'%
418+
data[0])
422419
return 1
423420
for i in range(1, numMessages+1):
424421
(typ, data) = server.fetch(str(i), '(RFC822)')
@@ -463,8 +460,8 @@ def do_pop(self, server, user='', password='', apop=0):
463460
# open a connection to the server and retrieve all messages
464461
try:
465462
server = poplib.POP3(server)
466-
except socket.error, message:
467-
print "POP server error:", message
463+
except socket.error:
464+
self.logger.exception('POP server error')
468465
return 1
469466
if apop:
470467
server.apop(user, password)
@@ -510,23 +507,22 @@ def handle_Message(self, message):
510507
sendto = message.getaddrlist('from')
511508
if not sendto:
512509
# very bad-looking message - we don't even know who sent it
513-
# XXX we should use a log file here...
514-
515-
sendto = [self.instance.config.ADMIN_EMAIL]
516-
517-
m = ['Subject: badly formed message from mail gateway']
518-
m.append('')
519-
m.append('The mail gateway retrieved a message which has no From:')
520-
m.append('line, indicating that it is corrupt. Please check your')
521-
m.append('mail gateway source. Failed message is attached.')
522-
m.append('')
523-
self.mailer.bounce_message(message, sendto, m,
524-
subject='Badly formed message from mail gateway')
510+
msg = ['Badly formed message from mail gateway. Headers:']
511+
msg.extend(message.headers)
512+
msg = '\n'.join(map(str, msg))
513+
self.logger.error(msg)
525514
return
526515

516+
msg = 'Handling message'
517+
if message.getheader('message-id'):
518+
msg += ' (Message-id=%r)'%message.getheader('message-id')
519+
self.logger.info(msg)
520+
527521
# try normal message-handling
528522
if not self.trapExceptions:
529523
return self.handle_message(message)
524+
525+
# no, we want to trap exceptions
530526
try:
531527
return self.handle_message(message)
532528
except MailUsageHelp:
@@ -551,24 +547,26 @@ def handle_Message(self, message):
551547
m.append(str(value))
552548
self.mailer.bounce_message(message, [sendto[0][1]], m)
553549
except IgnoreMessage:
554-
# XXX we should use a log file here...
555550
# do not take any action
556551
# this exception is thrown when email should be ignored
552+
msg = 'IgnoreMessage raised'
553+
if message.getheader('message-id'):
554+
msg += ' (Message-id=%r)'%message.getheader('message-id')
555+
self.logger.info(msg)
557556
return
558557
except:
558+
msg = 'Exception handling message'
559+
if message.getheader('message-id'):
560+
msg += ' (Message-id=%r)'%message.getheader('message-id')
561+
self.logger.exception(msg)
562+
559563
# bounce the message back to the sender with the error message
560-
# XXX we should use a log file here...
561564
# let the admin know that something very bad is happening
562565
sendto = [sendto[0][1], self.instance.config.ADMIN_EMAIL]
563566
m = ['']
564567
m.append('An unexpected error occurred during the processing')
565568
m.append('of your message. The tracker administrator is being')
566569
m.append('notified.\n')
567-
m.append('---- traceback of failure ----')
568-
s = cStringIO.StringIO()
569-
import traceback
570-
traceback.print_exc(None, s)
571-
m.append(s.getvalue())
572570
self.mailer.bounce_message(message, sendto, m)
573571

574572
def handle_message(self, message):
@@ -868,7 +866,7 @@ def handle_message(self, message):
868866
'no') == 'yes'
869867

870868
# parse the body of the message, stripping out bits as appropriate
871-
summary, content = parseContent(content, keep_citations,
869+
summary, content = parseContent(content, keep_citations,
872870
keep_body)
873871
content = content.strip()
874872

@@ -1124,4 +1122,4 @@ def parseContent(content, keep_citations, keep_body,
11241122

11251123
return summary, content
11261124

1127-
# vim: set filetype=python ts=4 sw=4 et si
1125+
# vim: set filetype=python sts=4 sw=4 et si

0 commit comments

Comments
 (0)