Changeset View
Changeset View
Standalone View
Standalone View
wallace/modules.py
Show All 14 Lines | |||||
# You should have received a copy of the GNU General Public License | # You should have received a copy of the GNU General Public License | ||||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
# | # | ||||
import os | import os | ||||
import sys | import sys | ||||
import time | import time | ||||
import traceback | |||||
from email import message_from_string | from email import message_from_string | ||||
from email.message import Message | from email.message import Message | ||||
from email.mime.base import MIMEBase | from email.mime.base import MIMEBase | ||||
from email.mime.message import MIMEMessage | from email.mime.message import MIMEMessage | ||||
from email.mime.multipart import MIMEMultipart | from email.mime.multipart import MIMEMultipart | ||||
from email.mime.text import MIMEText | from email.mime.text import MIMEText | ||||
from email.parser import Parser | from email.parser import Parser | ||||
▲ Show 20 Lines • Show All 80 Lines • ▼ Show 20 Line(s) | |||||
if not modules[name].has_key('function') and \ | if not modules[name].has_key('function') and \ | ||||
not modules[name].has_key('group'): | not modules[name].has_key('group'): | ||||
log.error(_("No such module %r in modules %r (2).") %(name, modules)) | log.error(_("No such module %r in modules %r (2).") %(name, modules)) | ||||
sys.exit(1) | sys.exit(1) | ||||
try: | try: | ||||
return modules[name]['function'](*args, **kw) | return modules[name]['function'](*args, **kw) | ||||
except Exception, errmsg: | except Exception, errmsg: | ||||
log.error(_("Unknown error occurred; %r") % (errmsg)) | log.exception(_("Module %r - Unknown error occurred; %r") % (name, errmsg)) | ||||
log.error("%s" % (traceback.format_exc())) | |||||
def heartbeat(name, *args, **kw): | def heartbeat(name, *args, **kw): | ||||
if not modules.has_key(name): | if not modules.has_key(name): | ||||
log.warning(_("No such module %r in modules %r (1).") % (name, modules)) | log.warning(_("No such module %r in modules %r (1).") % (name, modules)) | ||||
if modules[name].has_key('heartbeat'): | if modules[name].has_key('heartbeat'): | ||||
return modules[name]['heartbeat'](*args, **kw) | return modules[name]['heartbeat'](*args, **kw) | ||||
def _sendmail(sender, recipients, msg): | def _sendmail(sender, recipients, msg): | ||||
# NOTE: Use "127.0.0.1" here for IPv6 (see also the service | # NOTE: Use "127.0.0.1" here for IPv6 (see also the service | ||||
# definition in master.cf). | # definition in master.cf). | ||||
smtp = smtplib.SMTP("127.0.0.1", 10027) | |||||
sl = pykolab.logger.StderrToLogger(log) | |||||
smtplib.stderr = sl | |||||
smtp = smtplib.SMTP(timeout=5) | |||||
if conf.debuglevel > 8: | if conf.debuglevel > 8: | ||||
smtp.set_debuglevel(True) | smtp.set_debuglevel(1) | ||||
# Not an infinite loop | success = False | ||||
while True: | retries = 5 | ||||
while not success and retries > 0: | |||||
try: | try: | ||||
smtp.sendmail( | log.debug(_("Trying to send email via smtplib from %r, to %r") % (sender, recipients), level=8) | ||||
sender, | smtp.connect("127.0.0.1", 10027) | ||||
recipients, | _response = smtp.sendmail(sender, recipients, msg) | ||||
msg | |||||
) | if len(_response) == 0: | ||||
log.debug(_("SMTP sendmail OK"), level=8) | |||||
else: | |||||
log.debug(_("SMTP sendmail returned: %r") % (_response), level=8) | |||||
smtp.quit() | smtp.quit() | ||||
return True | success = True | ||||
break | |||||
vanmeeuwen: This line would prevent `smtp.quit()` and other cleanup from being called. | |||||
except smtplib.SMTPServerDisconnected, errmsg: | except smtplib.SMTPServerDisconnected, errmsg: | ||||
smtp.quit() | log.error("SMTP Server Disconnected Error, %r" % (errmsg)) | ||||
smtp.connect() | |||||
except smtplib.SMTPConnectError, errmsg: | |||||
# DEFER | |||||
log.error("SMTP Connect Error, %r" % (errmsg)) | |||||
Not Done ReplyNote that the existing smtplib.SMTP() used to be rebuilt the connection for here. vanmeeuwen: Note that the existing `smtplib.SMTP()` used to be rebuilt the connection for here. | |||||
Not Done ReplyThis does not invoke recreating the smtplib.SMTP() instance, therefore possibly looping? vanmeeuwen: This does not invoke recreating the `smtplib.SMTP()` instance, therefore possibly looping? | |||||
except smtplib.SMTPDataError, errmsg: | except smtplib.SMTPDataError, errmsg: | ||||
# DEFER | # DEFER | ||||
log.error("SMTP Data Error, %r" % (errmsg)) | log.error("SMTP Data Error, %r" % (errmsg)) | ||||
except smtplib.SMTPHeloError, errmsg: | except smtplib.SMTPHeloError, errmsg: | ||||
# DEFER | # DEFER | ||||
log.error("SMTP HELO Error, %r" % (errmsg)) | log.error("SMTP HELO Error, %r" % (errmsg)) | ||||
except smtplib.SMTPRecipientsRefused, errmsg: | except smtplib.SMTPRecipientsRefused, errmsg: | ||||
# REJECT, send NDR | # REJECT, send NDR | ||||
log.error("SMTP Recipient(s) Refused, %r" % (errmsg)) | log.error("SMTP Recipient(s) Refused, %r" % (errmsg)) | ||||
except smtplib.SMTPSenderRefused, errmsg: | except smtplib.SMTPSenderRefused, errmsg: | ||||
# REJECT, send NDR | # REJECT, send NDR | ||||
log.error("SMTP Sender Refused, %r" % (errmsg)) | log.error("SMTP Sender Refused, %r" % (errmsg)) | ||||
except Exception, errmsg: | except Exception, errmsg: | ||||
log.error(_("Unknown error occurred; %r") % (errmsg)) | log.exception(_("smtplib - Unknown error occurred: %r") % (errmsg)) | ||||
log.error("%r" % (traceback.format_exc())) | |||||
smtp.quit() | |||||
time.sleep(10) | |||||
retries -= 1 | |||||
return False | return success | ||||
def cb_action_HOLD(module, filepath): | def cb_action_HOLD(module, filepath): | ||||
log.info(_("Holding message in queue for manual review (%s by %s)") % (filepath, module)) | log.info(_("Holding message in queue for manual review (%s by %s)") % (filepath, module)) | ||||
def cb_action_DEFER(module, filepath): | def cb_action_DEFER(module, filepath): | ||||
log.info(_("Deferring message in %s (by module %s)") % (filepath, module)) | log.info(_("Deferring message in %s (by module %s)") % (filepath, module)) | ||||
# parse message headers | # parse message headers | ||||
▲ Show 20 Lines • Show All 212 Lines • Show Last 20 Lines |
This line would prevent smtp.quit() and other cleanup from being called.