[MERGE] forward port of branch saas-3 up to f7a76cb
[odoo/odoo.git] / openerp / addons / base / ir / ir_mail_server.py
index 73eb0f7..638eb38 100644 (file)
@@ -2,7 +2,7 @@
 ##############################################################################
 #
 #    OpenERP, Open Source Management Solution
-#    Copyright (C) 2011-2012 OpenERP S.A (<http://www.openerp.com>)
+#    Copyright (C) 2011-2014 OpenERP S.A. (<http://www.openerp.com>)
 #
 #    This program is free software: you can redistribute it and/or modify
 #    it under the terms of the GNU Affero General Public License as
 #
 ##############################################################################
 
-from email.MIMEText import MIMEText
-from email.MIMEBase import MIMEBase
-from email.MIMEMultipart import MIMEMultipart
-from email.Charset import Charset
-from email.Header import Header
+from email.mime.text import MIMEText
+from email.mime.base import MIMEBase
+from email.mime.multipart import MIMEMultipart
+from email.charset import Charset
+from email.header import Header
 from email.utils import formatdate, make_msgid, COMMASPACE, getaddresses, formataddr
 from email import Encoders
 import logging
@@ -158,8 +158,8 @@ class ir_mail_server(osv.osv):
                           "specified for outgoing emails (To/Cc/Bcc)")
 
     _columns = {
-        'name': fields.char('Description', size=64, required=True, select=True),
-        'smtp_host': fields.char('SMTP Server', size=128, required=True, help="Hostname or IP of SMTP server"),
+        'name': fields.char('Description', required=True, select=True),
+        'smtp_host': fields.char('SMTP Server', required=True, help="Hostname or IP of SMTP server"),
         'smtp_port': fields.integer('SMTP Port', size=5, required=True, help="SMTP Port. Usually 465 for SSL, and 25 or 587 for other cases."),
         'smtp_user': fields.char('Username', size=64, help="Optional username for SMTP authentication"),
         'smtp_pass': fields.char('Password', size=64, help="Optional password for SMTP authentication"),
@@ -406,6 +406,13 @@ class ir_mail_server(osv.osv):
         smtp_to_list = filter(None, tools.flatten(map(extract_rfc2822_addresses,[email_to, email_cc, email_bcc])))
         assert smtp_to_list, self.NO_VALID_RECIPIENT
 
+        x_forge_to = message['X-Forge-To']
+        if x_forge_to:
+            # `To:` header forged, e.g. for posting on mail.groups, to avoid confusion
+            del message['X-Forge-To']
+            del message['To'] # avoid multiple To: headers!
+            message['To'] = x_forge_to
+
         # Do not actually send emails in testing mode!
         if getattr(threading.currentThread(), 'testing', False):
             _test_logger.info("skip sending email in test mode")
@@ -452,21 +459,18 @@ class ir_mail_server(osv.osv):
                 mdir.add(message.as_string(True))
                 return message_id
 
+            smtp = None
             try:
                 smtp = self.connect(smtp_server, smtp_port, smtp_user, smtp_password, smtp_encryption or False, smtp_debug)
                 smtp.sendmail(smtp_from, smtp_to_list, message.as_string())
             finally:
-                try:
-                    # Close Connection of SMTP Server
+                if smtp is not None:
                     smtp.quit()
-                except Exception:
-                    # ignored, just a consequence of the previous exception
-                    pass
         except Exception, e:
             msg = _("Mail delivery failed via SMTP server '%s'.\n%s: %s") % (tools.ustr(smtp_server),
                                                                              e.__class__.__name__,
                                                                              tools.ustr(e))
-            _logger.exception(msg)
+            _logger.error(msg)
             raise MailDeliveryException(_("Mail Delivery Failed"), msg)
         return message_id