diff -r 6641e941ef1e -r ff1a9aa48cfd app/django/core/mail.py --- a/app/django/core/mail.py Tue Oct 14 12:36:55 2008 +0000 +++ b/app/django/core/mail.py Tue Oct 14 16:00:59 2008 +0000 @@ -71,10 +71,11 @@ def forbid_multi_line_headers(name, val): """Forbids multi-line headers, to prevent header injection.""" + val = force_unicode(val) if '\n' in val or '\r' in val: raise BadHeaderError("Header values can't contain newlines (got %r for header %r)" % (val, name)) try: - val = force_unicode(val).encode('ascii') + val = val.encode('ascii') except UnicodeEncodeError: if name.lower() in ('to', 'from', 'cc'): result = [] @@ -84,7 +85,10 @@ result.append(formataddr((nm, str(addr)))) val = ', '.join(result) else: - val = Header(force_unicode(val), settings.DEFAULT_CHARSET) + val = Header(val, settings.DEFAULT_CHARSET) + else: + if name.lower() == 'subject': + val = Header(val) return name, val class SafeMIMEText(MIMEText): @@ -174,7 +178,7 @@ def _send(self, email_message): """A helper method that does the actual sending.""" - if not email_message.to: + if not email_message.recipients(): return False try: self.connection.sendmail(email_message.from_email, @@ -205,10 +209,12 @@ conversions. """ if to: + assert not isinstance(to, basestring), '"to" argument must be a list or tuple' self.to = list(to) else: self.to = [] if bcc: + assert not isinstance(bcc, basestring), '"bcc" argument must be a list or tuple' self.bcc = list(bcc) else: self.bcc = [] @@ -241,8 +247,14 @@ msg['Subject'] = self.subject msg['From'] = self.from_email msg['To'] = ', '.join(self.to) - msg['Date'] = formatdate() - msg['Message-ID'] = make_msgid() + + # Email header names are case-insensitive (RFC 2045), so we have to + # accommodate that when doing comparisons. + header_names = [key.lower() for key in self.extra_headers] + if 'date' not in header_names: + msg['Date'] = formatdate() + if 'message-id' not in header_names: + msg['Message-ID'] = make_msgid() for name, value in self.extra_headers.items(): msg[name] = value return msg