diff --git a/roundup/mailer.py b/roundup/mailer.py
index f1a1af3bdf45a20f469dd7132b022449cf922df1..d44568e5fb190751b7ebc99e7acdeebb17e1c501 100644 (file)
--- a/roundup/mailer.py
+++ b/roundup/mailer.py
from roundup import __version__
from roundup.date import get_timezone
-from email.Utils import formatdate, formataddr
+from email.Utils import formatdate, formataddr, specialsre, escapesre
from email.Message import Message
from email.Header import Header
from email.MIMEText import MIMEText
del msg['Content-Transfer-Encoding']
msg['Content-Transfer-Encoding'] = 'quoted-printable'
+def nice_sender_header(name, address, charset):
+ # construct an address header so it's as human-readable as possible
+ # even in the presence of a non-ASCII name part
+ if not name:
+ return address
+ try:
+ encname = name.encode('ASCII')
+ except UnicodeEncodeError:
+ # use Header to encode correctly.
+ encname = Header(name, charset=charset).encode()
+
+ # the important bits of formataddr()
+ if specialsre.search(encname):
+ encname = '"%s"'%escapesre.sub(r'\\\g<0>', encname)
+
+ # now format the header as a string - don't return a Header as anonymous
+ # headers play poorly with Messages (eg. won't get wrapped properly)
+ return '%s <%s>'%(encname, address)
+
class Mailer:
"""Roundup-specific mail sending."""
def __init__(self, config):
name = author[0]
else:
name = unicode(author[0], 'utf-8')
- try:
- name = name.encode('ascii')
- except UnicodeError:
- name = Header(name, charset).encode()
- author = formataddr((name, author[1]))
+ author = nice_sender_header(name, author[1], charset)
if multipart:
message = MIMEMultipart()