diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py index 8d5be77ccfd..94ce3cef08b 100644 --- a/addons/mail/mail_mail.py +++ b/addons/mail/mail_mail.py @@ -198,7 +198,7 @@ class mail_mail(osv.Model): if partner: email_to = [formataddr((partner.name, partner.email))] else: - email_to = tools.email_split(mail.email_to) + email_to = tools.email_split_and_format(mail.email_to) return email_to def send_get_email_dict(self, cr, uid, mail, partner=None, context=None): diff --git a/addons/mail/tests/test_mail_gateway.py b/addons/mail/tests/test_mail_gateway.py index 7f16c4f0f5f..82568733ae7 100644 --- a/addons/mail/tests/test_mail_gateway.py +++ b/addons/mail/tests/test_mail_gateway.py @@ -19,6 +19,8 @@ # ############################################################################## +from email.utils import formataddr + from .common import TestMail from openerp.tools import mute_logger import socket @@ -298,7 +300,7 @@ class TestMailgateway(TestMail): 'message_process: incoming email on Partners alias should send a bounce email') self.assertIn('Frogs', sent_emails[0].get('subject'), 'message_process: bounce email on Partners alias should contain the original subject') - self.assertIn('test.sylvie.lelitre@agrolait.com', sent_emails[0].get('email_to'), + self.assertIn(formataddr(('Sylvie Lelitre', 'test.sylvie.lelitre@agrolait.com')), sent_emails[0].get('email_to'), 'message_process: bounce email on Partners alias should have original email sender as recipient') # Do: incoming email from an unknown partner on a Followers only alias -> bounce @@ -313,7 +315,7 @@ class TestMailgateway(TestMail): 'message_process: incoming email on Followers alias should send a bounce email') self.assertIn('Frogs', sent_emails[0].get('subject'), 'message_process: bounce email on Followers alias should contain the original subject') - self.assertIn('test.sylvie.lelitre@agrolait.com', sent_emails[0].get('email_to'), + self.assertIn(formataddr(('Sylvie Lelitre', 'test.sylvie.lelitre@agrolait.com')), sent_emails[0].get('email_to'), 'message_process: bounce email on Followers alias should have original email sender as recipient') # Do: incoming email from a known partner on a Partners alias -> ok (+ test on alias.user_id) diff --git a/addons/mail/tests/test_mail_group.py b/addons/mail/tests/test_mail_group.py index c523f6b2f38..e8934e19e95 100644 --- a/addons/mail/tests/test_mail_group.py +++ b/addons/mail/tests/test_mail_group.py @@ -103,7 +103,7 @@ class TestMailGroup(TestMail): for email in sent_emails: self.assertEqual( set(email['email_to']), - set([self.user_raoul.email, self.user_bert.email])) + set([formataddr((self.user_raoul.name, self.user_raoul.email)), formataddr((self.user_bert.name, self.user_bert.email))])) def test_mail_group_notification_recipients_separated(self): # Remove alias, should trigger classic behavior of mail group diff --git a/openerp/tools/mail.py b/openerp/tools/mail.py index b78e2e9168e..20d6117e778 100644 --- a/openerp/tools/mail.py +++ b/openerp/tools/mail.py @@ -29,7 +29,7 @@ import re import socket import threading import time -from email.utils import getaddresses +from email.utils import getaddresses, formataddr import openerp from openerp.loglevels import ustr @@ -680,3 +680,15 @@ def email_split(text): # is strictly required in RFC2822's `addr-spec`. if addr[1] if '@' in addr[1]] + +def email_split_and_format(text): + """ Return a list of email addresses found in ``text``, formatted using + formataddr. """ + if not text: + return [] + return [formataddr((addr[0], addr[1])) for addr in getaddresses([text]) + # getaddresses() returns '' when email parsing fails, and + # sometimes returns emails without at least '@'. The '@' + # is strictly required in RFC2822's `addr-spec`. + if addr[1] + if '@' in addr[1]]