From 245bb4ebdfeccb05134b3ff943c9fd0fb01173c2 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Tue, 12 Aug 2014 13:40:45 +0200 Subject: [PATCH] [FIX] mail: to/from/reply-to addresses formated according to RFC2822 Use formataddr method from email.utils lib, which do the job correctly --- addons/email_template/tests/test_mail.py | 2 +- addons/mail/mail_followers.py | 6 ++++-- addons/mail/mail_mail.py | 11 +++++------ addons/mail/tests/test_mail_features.py | 8 ++++---- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/addons/email_template/tests/test_mail.py b/addons/email_template/tests/test_mail.py index 2556864df7c..f46ee1cdc97 100644 --- a/addons/email_template/tests/test_mail.py +++ b/addons/email_template/tests/test_mail.py @@ -231,7 +231,7 @@ class test_message_compose(TestMailBase): # force send: take email_recipients into account email_template.send_mail(cr, uid, email_template_id, self.group_pigs_id, force_send=True, context=context) sent_emails = self._build_email_kwargs_list - email_to_lst = ['"Followers of Pigs" ', '"Followers of Pigs" ', '"Followers of Pigs" '] + email_to_lst = ['Followers of Pigs ', 'Followers of Pigs ', 'Followers of Pigs '] self.assertEqual(len(sent_emails), 3, 'email_template: send_mail: 3 valid email recipients -> should send 3 emails') for email in sent_emails: self.assertEqual(len(email['email_to']), 1, 'email_template: send_mail: email_recipient should send email to one recipient at a time') diff --git a/addons/mail/mail_followers.py b/addons/mail/mail_followers.py index fcd32ec7315..f4c74b0c996 100644 --- a/addons/mail/mail_followers.py +++ b/addons/mail/mail_followers.py @@ -18,6 +18,8 @@ # along with this program. If not, see # ############################################################################## +from email.utils import formataddr + from openerp.osv import osv, fields from openerp import tools, SUPERUSER_ID @@ -155,9 +157,9 @@ class mail_notification(osv.Model): # email_from: partner-user alias or partner email or mail.message email_from if msg.author_id and msg.author_id.user_ids and msg.author_id.user_ids[0].alias_domain and msg.author_id.user_ids[0].alias_name: - email_from = '%s <%s@%s>' % (msg.author_id.name, msg.author_id.user_ids[0].alias_name, msg.author_id.user_ids[0].alias_domain) + email_from = formataddr((msg.author_id.name, '%s@%s' % (msg.author_id.user_ids[0].alias_name, msg.author_id.user_ids[0].alias_domain))) elif msg.author_id: - email_from = '%s <%s>' % (msg.author_id.name, msg.author_id.email) + email_from = formataddr((msg.author_id.name, msg.author_id.email)) else: email_from = msg.email_from diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py index b558f4729be..1c53d0477a7 100644 --- a/addons/mail/mail_mail.py +++ b/addons/mail/mail_mail.py @@ -22,6 +22,7 @@ import base64 import logging import re +from email.utils import formataddr from urllib import urlencode from urlparse import urljoin @@ -216,10 +217,9 @@ class mail_mail(osv.Model): if email_reply_to and mail.model and mail.res_id: document_name = self.pool.get(mail.model).name_get(cr, SUPERUSER_ID, [mail.res_id], context=context)[0] if document_name: - # sanitize document name - sanitized_doc_name = re.sub(r'[^\w+.]+', '-', document_name[1]) # generate reply to - email_reply_to = _('"Followers of %s" <%s>') % (sanitized_doc_name, email_reply_to) + + email_reply_to = formataddr((_('Followers of %s') % document_name[1], email_reply_to)) return email_reply_to @@ -240,10 +240,9 @@ class mail_mail(osv.Model): # 2. if 'partner' is specified, but no related document: Partner Name # 3; fallback on mail.email_to that we split to have an email addresses list if partner and mail.record_name: - sanitized_record_name = re.sub(r'[^\w+.]+', '-', mail.record_name) - email_to = [_('"Followers of %s" <%s>') % (sanitized_record_name, partner.email)] + email_to = [formataddr((_('Followers of %s') % mail.record_name, partner.email))] elif partner: - email_to = ['%s <%s>' % (partner.name, partner.email)] + email_to = [formataddr((partner.name, partner.email))] else: email_to = tools.email_split(mail.email_to) diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py index ef6e54d1a40..2dd552f5c32 100644 --- a/addons/mail/tests/test_mail_features.py +++ b/addons/mail/tests/test_mail_features.py @@ -336,7 +336,7 @@ class test_mail(TestMailBase): # Test: notifications emails: to a and b, c is email only, r is author # test_emailto = ['Administrator ', 'Bert Tartopoils '] - test_emailto = ['"Followers of -Pigs-" ', '"Followers of -Pigs-" '] + test_emailto = [u'"Followers of \\"Pigs\\" !\xf9 $%-" ', u'"Followers of \\"Pigs\\" !\xf9 $%-" '] self.assertEqual(len(sent_emails), 2, 'message_post: notification emails wrong number of send emails') self.assertEqual(set([m['email_to'][0] for m in sent_emails]), set(test_emailto), @@ -348,7 +348,7 @@ class test_mail(TestMailBase): 'message_post: notification email sent to more than one email address instead of a precise partner') self.assertIn(sent_email['email_to'][0], test_emailto, 'message_post: notification email email_to incorrect') - self.assertEqual(sent_email['reply_to'], '"Followers of -Pigs-" ', + self.assertEqual(sent_email['reply_to'], u'"Followers of \\"Pigs\\" !\xf9 $%-" ', 'message_post: notification email reply_to incorrect') self.assertEqual(_subject, sent_email['subject'], 'message_post: notification email subject incorrect') @@ -410,7 +410,7 @@ class test_mail(TestMailBase): # Test: emails send by server (to a, b, c, d) # test_emailto = [u'Administrator ', u'Bert Tartopoils ', u'Carine Poilvache ', u'D\xe9d\xe9 Grosbedon '] - test_emailto = [u'"Followers of Pigs" ', u'"Followers of Pigs" ', u'"Followers of Pigs" ', u'"Followers of Pigs" '] + test_emailto = [u'Followers of Pigs ', u'Followers of Pigs ', u'Followers of Pigs ', u'Followers of Pigs '] # self.assertEqual(len(sent_emails), 3, 'sent_email number of sent emails incorrect') for sent_email in sent_emails: self.assertEqual(sent_email['email_from'], 'Raoul Grosbedon ', @@ -419,7 +419,7 @@ class test_mail(TestMailBase): 'message_post: notification email sent to more than one email address instead of a precise partner') self.assertIn(sent_email['email_to'][0], test_emailto, 'message_post: notification email email_to incorrect') - self.assertEqual(sent_email['reply_to'], '"Followers of Pigs" ', + self.assertEqual(sent_email['reply_to'], 'Followers of Pigs ', 'message_post: notification email reply_to incorrect: should name Followers of Pigs, and have raoul email') self.assertEqual(_mail_subject, sent_email['subject'], 'message_post: notification email subject incorrect')