app/django/core/mail.py
changeset 323 ff1a9aa48cfd
parent 54 03e267d67478
--- 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