from email.MIMEMultipart import MIMEMultipart
from email.Charset import Charset
from email.Header import Header
-from email.Utils import formatdate, make_msgid, COMMASPACE, parseaddr
+from email.utils import formatdate, make_msgid, COMMASPACE, getaddresses, formataddr
from email import Encoders
import logging
import re
``"Name"`` portion by the RFC2047-encoded
version, preserving the address part untouched.
"""
- header_text_utf8 = tools.ustr(header_text).encode('utf-8')
- header_text_ascii = try_coerce_ascii(header_text_utf8)
- if header_text_ascii:
- return header_text_ascii
-
- name, email = parseaddr(header_text_utf8)
- if not name:
- return email
-
- # non-ASCII characters are present, attempt to
- # replace all "Name" patterns with the RFC2047-
- # encoded version
- name_encoded = str(Header(name, 'utf-8'))
- header_text_utf8 = "%s <%s>" % (name_encoded, email)
- # try again after encoding
- header_text_ascii = try_coerce_ascii(header_text_utf8)
- if header_text_ascii:
- return header_text_ascii
- # fallback to extracting pure addresses only, which could
- # still cause a failure downstream if the actual addresses
- # contain non-ASCII characters
- return COMMASPACE.join(extract_rfc2822_addresses(header_text_utf8))
-
+ def encode_addr(addr):
+ name, email = addr
+ if not try_coerce_ascii(name):
+ name = str(Header(name, 'utf-8'))
+ return formataddr((name, email))
+
+ addresses = getaddresses([tools.ustr(header_text).encode('utf-8')])
+ return COMMASPACE.join(map(encode_addr, addresses))
class ir_mail_server(osv.osv):
"""Represents an SMTP server, able to send outgoing emails, with SSL and TLS capabilities."""