[FIX] P3: cross-version smtplib/email changes

* SMTPLib[P3] uses a debug method on ``SMTP`` rather than a global
  ``stderr``
* email.Encoders is a deprecated & outdated (since 2006) alias for
  email.encoders
This commit is contained in:
Xavier Morel
2017-05-15 12:24:04 +02:00
parent b5e7b7eee3
commit b9c3365d21
+9 -17
View File
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from email import Encoders
from email import encoders
from email.charset import Charset
from email.header import Header
from email.mime.base import MIMEBase
@@ -28,16 +28,16 @@ class MailDeliveryException(except_orm):
def __init__(self, name, value):
super(MailDeliveryException, self).__init__(name, value)
# Python 3: patch SMTP's internal printer/debugger
def _print_debug(self, *args):
_logger.debug(' '.join(str(a) for a in args))
smtplib.SMTP._print_debug = _print_debug
# Python 2: replace smtplib's stderr
class WriteToLogger(object):
"""debugging helper: behave as a fd and pipe to logger at the given level"""
def __init__(self, logger, level=logging.DEBUG):
self.logger = logger
self.level = level
def write(self, s):
self.logger.log(self.level, s)
_logger.debug(s)
smtplib.stderr = WriteToLogger()
def try_coerce_ascii(string_utf8):
"""Attempts to decode the given utf8-encoded string
@@ -159,14 +159,6 @@ class IrMailServer(models.Model):
"is used. Default priority is 10 (smaller number = higher priority)")
active = fields.Boolean(default=True)
def __init__(self, *args, **kwargs):
# Make sure we pipe the smtplib outputs to our own DEBUG logger
if not isinstance(smtplib.stderr, WriteToLogger):
logpiper = WriteToLogger(_logger)
smtplib.stderr = logpiper
smtplib.stdout = logpiper
super(IrMailServer, self).__init__(*args, **kwargs)
@api.multi
def name_get(self):
return [(server.id, "(%s)" % server.name) for server in self]
@@ -371,7 +363,7 @@ class IrMailServer(models.Model):
part.add_header('Content-Disposition', 'attachment', filename=filename_rfc2047)
part.set_payload(fcontent)
Encoders.encode_base64(part)
encoders.encode_base64(part)
msg.attach(part)
return msg