Changeset View
Changeset View
Standalone View
Standalone View
wallace/modules.py
Show First 20 Lines • Show All 126 Lines • ▼ Show 20 Lines | |||||
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). | ||||
sl = pykolab.logger.StderrToLogger(log) | sl = pykolab.logger.StderrToLogger(log) | ||||
smtplib.stderr = sl | smtplib.stderr = sl | ||||
smtp = smtplib.SMTP(timeout=5) | smtp = smtplib.SMTP(timeout=15) | ||||
if conf.debuglevel > 8: | if conf.debuglevel > 8: | ||||
smtp.set_debuglevel(1) | smtp.set_debuglevel(1) | ||||
success = False | success = False | ||||
retries = 5 | attempt = 1 | ||||
while not success and retries > 0: | while not success and attempt <= 5: | ||||
try: | try: | ||||
log.debug(_("Trying to send email via smtplib from %r, to %r") % (sender, recipients), level=8) | log.debug(_("Sending email via smtplib from %r, to %r (Attempt %r)") % (sender, recipients, attempt), level=8) | ||||
smtp.connect("127.0.0.1", 10027) | smtp.connect("127.0.0.1", 10027) | ||||
_response = smtp.sendmail(sender, recipients, msg) | _response = smtp.sendmail(sender, recipients, msg) | ||||
if len(_response) == 0: | if len(_response) == 0: | ||||
log.debug(_("SMTP sendmail OK"), level=8) | log.debug(_("SMTP sendmail OK"), level=8) | ||||
else: | else: | ||||
log.debug(_("SMTP sendmail returned: %r") % (_response), level=8) | log.debug(_("SMTP sendmail returned: %r") % (_response), level=8) | ||||
Show All 23 Lines | while not success and attempt <= 5: | ||||
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.exception(_("smtplib - Unknown error occurred: %r") % (errmsg)) | log.exception(_("smtplib - Unknown error occurred: %r") % (errmsg)) | ||||
try: | |||||
smtp.quit() | smtp.quit() | ||||
except Exception, errmsg: | |||||
log.error("smtplib quit() error - %r" % errmsg) | |||||
time.sleep(10) | time.sleep(10) | ||||
retries -= 1 | attempt += 1 | ||||
return success | 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)) | ||||
Show All 36 Lines | def cb_action_DEFER(module, filepath): | ||||
#if delta.seconds > 1800: | #if delta.seconds > 1800: | ||||
## TODO: Send NDR back to user | ## TODO: Send NDR back to user | ||||
#log.debug(_("Message in file %s older then 1800 seconds, deleting") % (filepath), level=8) | #log.debug(_("Message in file %s older then 1800 seconds, deleting") % (filepath), level=8) | ||||
#os.unlink(filepath) | #os.unlink(filepath) | ||||
def cb_action_REJECT(module, filepath): | def cb_action_REJECT(module, filepath): | ||||
log.info(_("Rejecting message in %s (by module %s)") % (filepath, module)) | log.info(_("Rejecting message in %s (by module %s)") % (filepath, module)) | ||||
log.debug(_("Rejecting message in: %r") %(filepath), level=8) | |||||
# parse message headers | # parse message headers | ||||
message = Parser().parse(open(filepath, 'r'), True) | message = Parser().parse(open(filepath, 'r'), True) | ||||
envelope_sender = getaddresses(message.get_all('From', [])) | envelope_sender = getaddresses(message.get_all('From', [])) | ||||
recipients = getaddresses(message.get_all('To', [])) + \ | recipients = getaddresses(message.get_all('To', [])) + \ | ||||
getaddresses(message.get_all('Cc', [])) + \ | getaddresses(message.get_all('Cc', [])) + \ | ||||
getaddresses(message.get_all('X-Kolab-To', [])) | getaddresses(message.get_all('X-Kolab-To', [])) | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | """) % ( | ||||
msg.attach(part) | msg.attach(part) | ||||
result = _sendmail( | result = _sendmail( | ||||
"MAILER-DAEMON@%s" % (constants.fqdn), | "MAILER-DAEMON@%s" % (constants.fqdn), | ||||
[formataddr(envelope_sender[0])], | [formataddr(envelope_sender[0])], | ||||
msg.as_string() | msg.as_string() | ||||
) | ) | ||||
log.debug(_("Rejection message was sent successfully: %r") % result) | |||||
if result: | if result: | ||||
os.unlink(filepath) | os.unlink(filepath) | ||||
else: | |||||
log.debug(_("Message %r was not removed from spool") % filepath) | |||||
def cb_action_ACCEPT(module, filepath): | def cb_action_ACCEPT(module, filepath): | ||||
log.info(_("Accepting message in %s (by module %s)") % (filepath, module)) | log.info(_("Accepting message in %s (by module %s)") % (filepath, module)) | ||||
log.debug(_("Accepting message in: %r") %(filepath), level=8) | log.debug(_("Accepting message in: %r") %(filepath), level=8) | ||||
# parse message headers | # parse message headers | ||||
message = Parser().parse(open(filepath, 'r'), True) | message = Parser().parse(open(filepath, 'r'), True) | ||||
Show All 13 Lines | result = _sendmail( | ||||
# - Second, strip NUL characters - I don't know where they | # - Second, strip NUL characters - I don't know where they | ||||
# come from (TODO) | # come from (TODO) | ||||
# - Third, a character return is inserted somewhere. It | # - Third, a character return is inserted somewhere. It | ||||
# divides the body from the headers - and we don't like (TODO) | # divides the body from the headers - and we don't like (TODO) | ||||
# @TODO: check if we need Parser().parse() to load the whole message | # @TODO: check if we need Parser().parse() to load the whole message | ||||
message.as_string() | message.as_string() | ||||
) | ) | ||||
log.debug(_("Message was sent successfully: %r") % result) | |||||
if result: | if result: | ||||
os.unlink(filepath) | os.unlink(filepath) | ||||
else: | |||||
log.debug(_("Message %r was not removed from spool") % filepath) | |||||
def register_group(dirname, module): | def register_group(dirname, module): | ||||
modules_base_path = os.path.join(os.path.dirname(__file__), module) | modules_base_path = os.path.join(os.path.dirname(__file__), module) | ||||
modules[module] = {} | modules[module] = {} | ||||
for modules_path, dirnames, filenames in os.walk(modules_base_path): | for modules_path, dirnames, filenames in os.walk(modules_base_path): | ||||
if not modules_path == modules_base_path: | if not modules_path == modules_base_path: | ||||
▲ Show 20 Lines • Show All 55 Lines • Show Last 20 Lines |