diff --git a/tests/regressiontests/mail/tests.py b/tests/regressiontests/mail/tests.py index 05973e608c8..b0c60d836e4 100644 --- a/tests/regressiontests/mail/tests.py +++ b/tests/regressiontests/mail/tests.py @@ -1,446 +1,345 @@ # coding: utf-8 +import email +import os +import shutil +import sys +import tempfile +from StringIO import StringIO +from django.conf import settings +from django.core import mail +from django.core.mail import EmailMessage, mail_admins, mail_managers, EmailMultiAlternatives +from django.core.mail import send_mail, send_mass_mail +from django.core.mail.backends.base import BaseEmailBackend +from django.core.mail.backends import console, dummy, locmem, filebased, smtp +from django.core.mail.message import BadHeaderError +from django.test import TestCase +from django.utils.translation import ugettext_lazy -r""" -# Tests for the django.core.mail. +class MailTests(TestCase): ->>> import os ->>> import shutil ->>> import tempfile ->>> from StringIO import StringIO ->>> from django.conf import settings ->>> from django.core import mail ->>> from django.core.mail import EmailMessage, mail_admins, mail_managers, EmailMultiAlternatives ->>> from django.core.mail import send_mail, send_mass_mail ->>> from django.core.mail.backends.base import BaseEmailBackend ->>> from django.core.mail.backends import console, dummy, locmem, filebased, smtp ->>> from django.utils.translation import ugettext_lazy + def test_ascii(self): + email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com']) + message = email.message() + self.assertEqual(message['Subject'].encode(), 'Subject') + self.assertEqual(message.get_payload(), 'Content') + self.assertEqual(message['From'], 'from@example.com') + self.assertEqual(message['To'], 'to@example.com') -# Test normal ascii character case: + def test_multiple_recipients(self): + email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com','other@example.com']) + message = email.message() + self.assertEqual(message['Subject'].encode(), 'Subject') + self.assertEqual(message.get_payload(), 'Content') + self.assertEqual(message['From'], 'from@example.com') + self.assertEqual(message['To'], 'to@example.com, other@example.com') ->>> email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com']) ->>> message = email.message() ->>> message['Subject'].encode() -'Subject' ->>> message.get_payload() -'Content' ->>> message['From'] -'from@example.com' ->>> message['To'] -'to@example.com' + def test_cc(self): + """Regression test for #7722""" + email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com'], cc=['cc@example.com']) + message = email.message() + self.assertEqual(message['Cc'], 'cc@example.com') + self.assertEqual(email.recipients(), ['to@example.com', 'cc@example.com']) -# Test multiple-recipient case + # Verify headers + old_stdout = sys.stdout + sys.stdout = StringIO() + connection = console.EmailBackend() + connection.send_messages([email]) + self.assertTrue(sys.stdout.getvalue().startswith('Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Subject\nFrom: from@example.com\nTo: to@example.com\nCc: cc@example.com\nDate: ')) + sys.stdout = old_stdout ->>> email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com','other@example.com']) ->>> message = email.message() ->>> message['Subject'].encode() -'Subject' ->>> message.get_payload() -'Content' ->>> message['From'] -'from@example.com' ->>> message['To'] -'to@example.com, other@example.com' + # Test multiple CC with multiple To + email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com', 'other@example.com'], cc=['cc@example.com', 'cc.other@example.com']) + message = email.message() + self.assertEqual(message['Cc'], 'cc@example.com, cc.other@example.com') + self.assertEqual(email.recipients(), ['to@example.com', 'other@example.com', 'cc@example.com', 'cc.other@example.com']) -# Test for header injection + # Testing with Bcc + email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com', 'other@example.com'], cc=['cc@example.com', 'cc.other@example.com'], bcc=['bcc@example.com']) + message = email.message() + self.assertEqual(message['Cc'], 'cc@example.com, cc.other@example.com') + self.assertEqual(email.recipients(), ['to@example.com', 'other@example.com', 'cc@example.com', 'cc.other@example.com', 'bcc@example.com']) ->>> email = EmailMessage('Subject\nInjection Test', 'Content', 'from@example.com', ['to@example.com']) ->>> message = email.message() -Traceback (most recent call last): - ... -BadHeaderError: Header values can't contain newlines (got u'Subject\nInjection Test' for header 'Subject') + def test_header_injection(self): + email = EmailMessage('Subject\nInjection Test', 'Content', 'from@example.com', ['to@example.com']) + self.assertRaises(BadHeaderError, email.message) + email = EmailMessage(ugettext_lazy('Subject\nInjection Test'), 'Content', 'from@example.com', ['to@example.com']) + self.assertRaises(BadHeaderError, email.message) ->>> email = EmailMessage(ugettext_lazy('Subject\nInjection Test'), 'Content', 'from@example.com', ['to@example.com']) ->>> message = email.message() -Traceback (most recent call last): - ... -BadHeaderError: Header values can't contain newlines (got u'Subject\nInjection Test' for header 'Subject') + def test_space_continuation(self): + """ + Test for space continuation character in long (ascii) subject headers (#7747) + """ + email = EmailMessage('Long subject lines that get wrapped should use a space continuation character to get expected behaviour in Outlook and Thunderbird', 'Content', 'from@example.com', ['to@example.com']) + message = email.message() + self.assertEqual(message['Subject'], 'Long subject lines that get wrapped should use a space continuation\n character to get expected behaviour in Outlook and Thunderbird') -# Test for space continuation character in long (ascii) subject headers (#7747) + def test_message_header_overrides(self): + """ + Specifying dates or message-ids in the extra headers overrides the + default values (#9233) + """ + headers = {"date": "Fri, 09 Nov 2001 01:08:47 -0000", "Message-ID": "foo"} + email = EmailMessage('subject', 'content', 'from@example.com', ['to@example.com'], headers=headers) + self.assertEqual(email.message().as_string(), 'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: subject\nFrom: from@example.com\nTo: to@example.com\ndate: Fri, 09 Nov 2001 01:08:47 -0000\nMessage-ID: foo\n\ncontent') ->>> email = EmailMessage('Long subject lines that get wrapped should use a space continuation character to get expected behaviour in Outlook and Thunderbird', 'Content', 'from@example.com', ['to@example.com']) ->>> message = email.message() ->>> message.as_string() -'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Long subject lines that get wrapped should use a space continuation\n character to get expected behaviour in Outlook and Thunderbird\nFrom: from@example.com\nTo: to@example.com\nDate: ...\nMessage-ID: <...>\n\nContent' + def test_empty_admins(self): + """ + Test that mail_admins/mail_managers doesn't connect to the mail server + if there are no recipients (#9383) + """ + old_admins = settings.ADMINS + old_managers = settings.MANAGERS -# Specifying dates or message-ids in the extra headers overrides the defaul -# values (#9233). + settings.ADMINS = settings.MANAGERS = [('nobody','nobody@example.com')] + mail.outbox = [] + mail_admins('hi', 'there') + self.assertEqual(len(mail.outbox), 1) + mail.outbox = [] + mail_managers('hi', 'there') + self.assertEqual(len(mail.outbox), 1) ->>> headers = {"date": "Fri, 09 Nov 2001 01:08:47 -0000", "Message-ID": "foo"} ->>> email = EmailMessage('subject', 'content', 'from@example.com', ['to@example.com'], headers=headers) ->>> email.message().as_string() -'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: subject\nFrom: from@example.com\nTo: to@example.com\ndate: Fri, 09 Nov 2001 01:08:47 -0000\nMessage-ID: foo\n\ncontent' + settings.ADMINS = settings.MANAGERS = [] + mail.outbox = [] + mail_admins('hi', 'there') + self.assertEqual(len(mail.outbox), 0) + mail.outbox = [] + mail_managers('hi', 'there') + self.assertEqual(len(mail.outbox), 0) -# Test that mail_admins/mail_managers doesn't connect to the mail server if there are no recipients (#9383) + settings.ADMINS = old_admins + settings.MANAGERS = old_managers ->>> old_admins = settings.ADMINS ->>> old_managers = settings.MANAGERS ->>> settings.ADMINS = [] ->>> settings.MANAGERS = [] ->>> mail.outbox = [] ->>> mail_admins('hi','there') ->>> len(mail.outbox) -0 ->>> mail.outbox = [] ->>> mail_managers('hi','there') ->>> len(mail.outbox) -0 ->>> settings.ADMINS = settings.MANAGERS = [('nobody','nobody@example.com')] ->>> mail.outbox = [] ->>> mail_admins('hi','there') ->>> len(mail.outbox) -1 ->>> mail.outbox = [] ->>> mail_managers('hi','there') ->>> len(mail.outbox) -1 + def test_from_header(self): + """ + Make sure we can manually set the From header (#9214) + """ + email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + message = email.message() + self.assertEqual(message['From'], 'from@example.com') -# Make sure we can manually set the From header (#9214) + def test_multiple_message_call(self): + """ + Regression for #13259 - Make sure that headers are not changed when + calling EmailMessage.message() + """ + email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + message = email.message() + self.assertEqual(message['From'], 'from@example.com') + message = email.message() + self.assertEqual(message['From'], 'from@example.com') ->>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> message = email.message() ->>> message['From'] -'from@example.com' + def test_unicode_header(self): + """ + Regression for #11144 - When a to/from/cc header contains unicode, + make sure the email addresses are parsed correctly (especially with + regards to commas) + """ + email = EmailMessage('Subject', 'Content', 'from@example.com', ['"Firstname Sürname" ','other@example.com']) + self.assertEqual(email.message()['To'], '=?utf-8?q?Firstname_S=C3=BCrname?= , other@example.com') + email = EmailMessage('Subject', 'Content', 'from@example.com', ['"Sürname, Firstname" ','other@example.com']) + self.assertEqual(email.message()['To'], '=?utf-8?q?S=C3=BCrname=2C_Firstname?= , other@example.com') -# Regression for #13259 - Make sure that headers are not changed -# when calling EmailMessage.message() ->>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> message = email.message() ->>> message['From'] -'from@example.com' ->>> message = email.message() ->>> message['From'] -'from@example.com' + def test_safe_mime_multipart(self): + """ + Make sure headers can be set with a different encoding than utf-8 in + SafeMIMEMultipart as well + """ + headers = {"Date": "Fri, 09 Nov 2001 01:08:47 -0000", "Message-ID": "foo"} + subject, from_email, to = 'hello', 'from@example.com', '"Sürname, Firstname" ' + text_content = 'This is an important message.' + html_content = '

This is an important message.

' + msg = EmailMultiAlternatives('Message from Firstname Sürname', text_content, from_email, [to], headers=headers) + msg.attach_alternative(html_content, "text/html") + msg.encoding = 'iso-8859-1' + self.assertEqual(msg.message()['To'], '=?iso-8859-1?q?S=FCrname=2C_Firstname?= ') + self.assertEqual(msg.message()['Subject'].encode(), u'=?iso-8859-1?q?Message_from_Firstname_S=FCrname?=') -# Regression for #11144 - When a to/from/cc header contains unicode, -# make sure the email addresses are parsed correctly (especially -# with regards to commas) ->>> email = EmailMessage('Subject', 'Content', 'from@example.com', ['"Firstname Sürname" ','other@example.com']) ->>> email.message()['To'] -'=?utf-8?q?Firstname_S=C3=BCrname?= , other@example.com' + def test_encoding(self): + """ + Regression for #12791 - Encode body correctly with other encodings + than utf-8 + """ + email = EmailMessage('Subject', 'Firstname Sürname is a great guy.', 'from@example.com', ['other@example.com']) + email.encoding = 'iso-8859-1' + message = email.message() + self.assertTrue(message.as_string().startswith('Content-Type: text/plain; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Subject\nFrom: from@example.com\nTo: other@example.com')) + self.assertEqual(message.get_payload(), 'Firstname S=FCrname is a great guy.') ->>> email = EmailMessage('Subject', 'Content', 'from@example.com', ['"Sürname, Firstname" ','other@example.com']) ->>> email.message()['To'] -'=?utf-8?q?S=C3=BCrname=2C_Firstname?= , other@example.com' + # Make sure MIME attachments also works correctly with other encodings than utf-8 + text_content = 'Firstname Sürname is a great guy.' + html_content = '

Firstname Sürname is a great guy.

' + msg = EmailMultiAlternatives('Subject', text_content, 'from@example.com', ['to@example.com']) + msg.encoding = 'iso-8859-1' + msg.attach_alternative(html_content, "text/html") + self.assertEqual(msg.message().get_payload(0).as_string(), 'Content-Type: text/plain; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\n\nFirstname S=FCrname is a great guy.') + self.assertEqual(msg.message().get_payload(1).as_string(), 'Content-Type: text/html; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\n\n

Firstname S=FCrname is a great guy.

') -# Regression for #6918 - When a header contains unicode, -# make sure headers can be set with a different encoding than utf-8 ->>> email = EmailMessage('Message from Firstname Sürname', 'Content', 'from@example.com', ['"Sürname, Firstname" ','other@example.com']) ->>> email.encoding = 'iso-8859-1' ->>> email.message()['To'] -'=?iso-8859-1?q?S=FCrname=2C_Firstname?= , other@example.com' ->>> email.message()['Subject'].encode() -u'=?iso-8859-1?q?Message_from_Firstname_S=FCrname?=' + def test_attachments(self): + """Regression test for #9367""" + headers = {"Date": "Fri, 09 Nov 2001 01:08:47 -0000", "Message-ID": "foo"} + subject, from_email, to = 'hello', 'from@example.com', 'to@example.com' + text_content = 'This is an important message.' + html_content = '

This is an important message.

' + msg = EmailMultiAlternatives(subject, text_content, from_email, [to], headers=headers) + msg.attach_alternative(html_content, "text/html") + msg.attach("an attachment.pdf", "%PDF-1.4.%...", mimetype="application/pdf") + msg_str = msg.message().as_string() + message = email.message_from_string(msg_str) + self.assertTrue(message.is_multipart()) + self.assertEqual(message.get_content_type(), 'multipart/mixed') + self.assertEqual(message.get_default_type(), 'text/plain') + payload = message.get_payload() + self.assertEqual(payload[0].get_content_type(), 'multipart/alternative') + self.assertEqual(payload[1].get_content_type(), 'application/pdf') -# Make sure headers can be set with a different encoding than utf-8 in SafeMIMEMultipart as well ->>> headers = {"Date": "Fri, 09 Nov 2001 01:08:47 -0000", "Message-ID": "foo"} ->>> subject, from_email, to = 'hello', 'from@example.com', '"Sürname, Firstname" ' ->>> text_content = 'This is an important message.' ->>> html_content = '

This is an important message.

' ->>> msg = EmailMultiAlternatives('Message from Firstname Sürname', text_content, from_email, [to], headers=headers) ->>> msg.attach_alternative(html_content, "text/html") ->>> msg.encoding = 'iso-8859-1' ->>> msg.message()['To'] -'=?iso-8859-1?q?S=FCrname=2C_Firstname?= ' ->>> msg.message()['Subject'].encode() -u'=?iso-8859-1?q?Message_from_Firstname_S=FCrname?=' + def test_arbitrary_stream(self): + """ + Test that the console backend can be pointed at an arbitrary stream. + """ + s = StringIO() + connection = mail.get_connection('django.core.mail.backends.console.EmailBackend', stream=s) + send_mail('Subject', 'Content', 'from@example.com', ['to@example.com'], connection=connection) + self.assertTrue(s.getvalue().startswith('Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Subject\nFrom: from@example.com\nTo: to@example.com\nDate: ')) -# Regression for #12791 - Encode body correctly with other encodings than utf-8 ->>> email = EmailMessage('Subject', 'Firstname Sürname is a great guy.', 'from@example.com', ['other@example.com']) ->>> email.encoding = 'iso-8859-1' ->>> message = email.message() ->>> message.as_string() -'Content-Type: text/plain; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Subject\nFrom: from@example.com\nTo: other@example.com\nDate: ...\nMessage-ID: <...>\n\nFirstname S=FCrname is a great guy.' + def test_stdout(self): + """Make sure that the console backend writes to stdout by default""" + old_stdout = sys.stdout + sys.stdout = StringIO() + connection = console.EmailBackend() + email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + connection.send_messages([email]) + self.assertTrue(sys.stdout.getvalue().startswith('Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Subject\nFrom: from@example.com\nTo: to@example.com\nDate: ')) + sys.stdout = old_stdout -# Make sure MIME attachments also works correctly with other encodings than utf-8 ->>> text_content = 'Firstname Sürname is a great guy.' ->>> html_content = '

Firstname Sürname is a great guy.

' ->>> msg = EmailMultiAlternatives('Subject', text_content, 'from@example.com', ['to@example.com']) ->>> msg.encoding = 'iso-8859-1' ->>> msg.attach_alternative(html_content, "text/html") ->>> msg.message().get_payload(0).as_string() -'Content-Type: text/plain; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\n\nFirstname S=FCrname is a great guy.' ->>> msg.message().get_payload(1).as_string() -'Content-Type: text/html; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\n\n

Firstname S=FCrname is a great guy.

' + def test_dummy(self): + """ + Make sure that dummy backends returns correct number of sent messages + """ + connection = dummy.EmailBackend() + email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + self.assertEqual(connection.send_messages([email, email, email]), 3) -# Handle attachments within an multipart/alternative mail correctly (#9367) -# (test is not as precise/clear as it could be w.r.t. email tree structure, -# but it's good enough.) ->>> headers = {"Date": "Fri, 09 Nov 2001 01:08:47 -0000", "Message-ID": "foo"} ->>> subject, from_email, to = 'hello', 'from@example.com', 'to@example.com' ->>> text_content = 'This is an important message.' ->>> html_content = '

This is an important message.

' ->>> msg = EmailMultiAlternatives(subject, text_content, from_email, [to], headers=headers) ->>> msg.attach_alternative(html_content, "text/html") ->>> msg.attach("an attachment.pdf", "%PDF-1.4.%...", mimetype="application/pdf") ->>> print msg.message().as_string() -Content-Type: multipart/mixed; boundary="..." -MIME-Version: 1.0 -Subject: hello -From: from@example.com -To: to@example.com -Date: Fri, 09 Nov 2001 01:08:47 -0000 -Message-ID: foo -... -Content-Type: multipart/alternative;... -... -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -... -This is an important message. -... -Content-Type: text/html; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -... -

This is an important message.

-... -... -Content-Type: application/pdf -MIME-Version: 1.0 -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; filename="an attachment.pdf" -... -JVBERi0xLjQuJS4uLg== -... + def test_locmem(self): + """ + Make sure that the locmen backend populates the outbox. + """ + mail.outbox = [] + connection = locmem.EmailBackend() + email1 = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + email2 = EmailMessage('Subject 2', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + connection.send_messages([email1, email2]) + self.assertEqual(len(mail.outbox), 2) + self.assertEqual(mail.outbox[0].subject, 'Subject') + self.assertEqual(mail.outbox[1].subject, 'Subject 2') + + # Make sure that multiple locmem connections share mail.outbox + mail.outbox = [] + connection2 = locmem.EmailBackend() + email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + connection.send_messages([email]) + connection2.send_messages([email]) + self.assertEqual(len(mail.outbox), 2) -# Make sure that the console backend writes to stdout by default ->>> connection = console.EmailBackend() ->>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> connection.send_messages([email]) -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Subject: Subject -From: from@example.com -To: to@example.com -Date: ... -Message-ID: ... + def test_file_backend(self): + tmp_dir = tempfile.mkdtemp() + connection = filebased.EmailBackend(file_path=tmp_dir) + email1 = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + connection.send_messages([email1]) + self.assertEqual(len(os.listdir(tmp_dir)), 1) + message = email.message_from_file(open(os.path.join(tmp_dir, os.listdir(tmp_dir)[0]))) + self.assertEqual(message.get_content_type(), 'text/plain') + self.assertEqual(message.get('subject'), 'Subject') + self.assertEqual(message.get('from'), 'from@example.com') + self.assertEqual(message.get('to'), 'to@example.com') + connection2 = filebased.EmailBackend(file_path=tmp_dir) + connection2.send_messages([email1]) + self.assertEqual(len(os.listdir(tmp_dir)), 2) + connection.send_messages([email1]) + self.assertEqual(len(os.listdir(tmp_dir)), 2) + email1.connection = filebased.EmailBackend(file_path=tmp_dir) + connection_created = connection.open() + email1.send() + self.assertEqual(len(os.listdir(tmp_dir)), 3) + email1.send() + self.assertEqual(len(os.listdir(tmp_dir)), 3) + connection.close() + shutil.rmtree(tmp_dir) -Content -------------------------------------------------------------------------------- -1 + def test_arbitrary_keyword(self): + """ + Make sure that get_connection() accepts arbitrary keyword that might be + used with custom backends. + """ + c = mail.get_connection(fail_silently=True, foo='bar') + self.assertTrue(c.fail_silently) -# Test that the console backend can be pointed at an arbitrary stream ->>> s = StringIO() ->>> connection = mail.get_connection('django.core.mail.backends.console.EmailBackend', stream=s) ->>> send_mail('Subject', 'Content', 'from@example.com', ['to@example.com'], connection=connection) -1 ->>> print s.getvalue() -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Subject: Subject -From: from@example.com -To: to@example.com -Date: ... -Message-ID: ... + def test_custom_backend(self): + """Test custom backend defined in this suite.""" + conn = mail.get_connection('regressiontests.mail.custombackend.EmailBackend') + self.assertTrue(hasattr(conn, 'test_outbox')) + email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) + conn.send_messages([email]) + self.assertEqual(len(conn.test_outbox), 1) -Content -------------------------------------------------------------------------------- + def test_backend_arg(self): + """Test backend argument of mail.get_connection()""" + self.assertTrue(isinstance(mail.get_connection('django.core.mail.backends.smtp.EmailBackend'), smtp.EmailBackend)) + self.assertTrue(isinstance(mail.get_connection('django.core.mail.backends.locmem.EmailBackend'), locmem.EmailBackend)) + self.assertTrue(isinstance(mail.get_connection('django.core.mail.backends.dummy.EmailBackend'), dummy.EmailBackend)) + self.assertTrue(isinstance(mail.get_connection('django.core.mail.backends.console.EmailBackend'), console.EmailBackend)) + tmp_dir = tempfile.mkdtemp() + self.assertTrue(isinstance(mail.get_connection('django.core.mail.backends.filebased.EmailBackend', file_path=tmp_dir), filebased.EmailBackend)) + shutil.rmtree(tmp_dir) + self.assertTrue(isinstance(mail.get_connection(), locmem.EmailBackend)) -# Make sure that dummy backends returns correct number of sent messages ->>> connection = dummy.EmailBackend() ->>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> connection.send_messages([email, email, email]) -3 + def test_connection_arg(self): + """Test connection argument to send_mail(), et. al.""" + connection = mail.get_connection('django.core.mail.backends.locmem.EmailBackend') -# Make sure that locmen backend populates the outbox ->>> mail.outbox = [] ->>> connection = locmem.EmailBackend() ->>> email1 = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> email2 = EmailMessage('Subject 2', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> connection.send_messages([email1, email2]) -2 ->>> len(mail.outbox) -2 ->>> mail.outbox[0].subject -'Subject' ->>> mail.outbox[1].subject -'Subject 2' + mail.outbox = [] + send_mail('Subject', 'Content', 'from@example.com', ['to@example.com'], connection=connection) + self.assertEqual(len(mail.outbox), 1) + message = mail.outbox[0] + self.assertEqual(message.subject, 'Subject') + self.assertEqual(message.from_email, 'from@example.com') + self.assertEqual(message.to, ['to@example.com']) -# Make sure that multiple locmem connections share mail.outbox ->>> mail.outbox = [] ->>> connection1 = locmem.EmailBackend() ->>> connection2 = locmem.EmailBackend() ->>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> connection1.send_messages([email]) -1 ->>> connection2.send_messages([email]) -1 ->>> len(mail.outbox) -2 + mail.outbox = [] + send_mass_mail([ + ('Subject1', 'Content1', 'from1@example.com', ['to1@example.com']), + ('Subject2', 'Content2', 'from2@example.com', ['to2@example.com']) + ], connection=connection) + self.assertEqual(len(mail.outbox), 2) + message = mail.outbox[0] + self.assertEqual(message.subject, 'Subject1') + self.assertEqual(message.from_email, 'from1@example.com') + self.assertEqual(message.to, ['to1@example.com']) + message = mail.outbox[1] + self.assertEqual(message.subject, 'Subject2') + self.assertEqual(message.from_email, 'from2@example.com') + self.assertEqual(message.to, ['to2@example.com']) -# Make sure that the file backend write to the right location ->>> tmp_dir = tempfile.mkdtemp() ->>> connection = filebased.EmailBackend(file_path=tmp_dir) ->>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> connection.send_messages([email]) -1 ->>> len(os.listdir(tmp_dir)) -1 ->>> print open(os.path.join(tmp_dir, os.listdir(tmp_dir)[0])).read() -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Subject: Subject -From: from@example.com -To: to@example.com -Date: ... -Message-ID: ... + old_admins = settings.ADMINS + old_managers = settings.MANAGERS + settings.ADMINS = settings.MANAGERS = [('nobody','nobody@example.com')] -Content -------------------------------------------------------------------------------- + mail.outbox = [] + mail_admins('Subject', 'Content', connection=connection) + self.assertEqual(len(mail.outbox), 1) + message = mail.outbox[0] + self.assertEqual(message.subject, '[Django] Subject') + self.assertEqual(message.from_email, 'root@localhost') + self.assertEqual(message.to, ['nobody@example.com']) ->>> connection2 = filebased.EmailBackend(file_path=tmp_dir) ->>> connection2.send_messages([email]) -1 ->>> len(os.listdir(tmp_dir)) -2 ->>> connection.send_messages([email]) -1 ->>> len(os.listdir(tmp_dir)) -2 ->>> email.connection = filebased.EmailBackend(file_path=tmp_dir) ->>> connection_created = connection.open() ->>> num_sent = email.send() ->>> len(os.listdir(tmp_dir)) -3 ->>> num_sent = email.send() ->>> len(os.listdir(tmp_dir)) -3 ->>> connection.close() ->>> shutil.rmtree(tmp_dir) + mail.outbox = [] + mail_managers('Subject', 'Content', connection=connection) + self.assertEqual(len(mail.outbox), 1) + message = mail.outbox[0] + self.assertEqual(message.subject, '[Django] Subject') + self.assertEqual(message.from_email, 'root@localhost') + self.assertEqual(message.to, ['nobody@example.com']) -# Make sure that get_connection() accepts arbitrary keyword that might be -# used with custom backends. ->>> c = mail.get_connection(fail_silently=True, foo='bar') ->>> c.fail_silently -True + settings.ADMINS = old_admins + settings.MANAGERS = old_managers -# Test custom backend defined in this suite. ->>> conn = mail.get_connection('regressiontests.mail.custombackend.EmailBackend') ->>> hasattr(conn, 'test_outbox') -True ->>> email = EmailMessage('Subject', 'Content', 'bounce@example.com', ['to@example.com'], headers={'From': 'from@example.com'}) ->>> conn.send_messages([email]) -1 ->>> len(conn.test_outbox) -1 - -# Test backend argument of mail.get_connection() ->>> isinstance(mail.get_connection('django.core.mail.backends.smtp.EmailBackend'), smtp.EmailBackend) -True ->>> isinstance(mail.get_connection('django.core.mail.backends.locmem.EmailBackend'), locmem.EmailBackend) -True ->>> isinstance(mail.get_connection('django.core.mail.backends.dummy.EmailBackend'), dummy.EmailBackend) -True ->>> isinstance(mail.get_connection('django.core.mail.backends.console.EmailBackend'), console.EmailBackend) -True ->>> tmp_dir = tempfile.mkdtemp() ->>> isinstance(mail.get_connection('django.core.mail.backends.filebased.EmailBackend', file_path=tmp_dir), filebased.EmailBackend) -True ->>> shutil.rmtree(tmp_dir) ->>> isinstance(mail.get_connection(), locmem.EmailBackend) -True - -# Test connection argument of send_mail() et al ->>> connection = mail.get_connection('django.core.mail.backends.console.EmailBackend') ->>> send_mail('Subject', 'Content', 'from@example.com', ['to@example.com'], connection=connection) -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Subject: Subject -From: from@example.com -To: to@example.com -Date: ... -Message-ID: ... - -Content -------------------------------------------------------------------------------- -1 - ->>> send_mass_mail([ -... ('Subject1', 'Content1', 'from1@example.com', ['to1@example.com']), -... ('Subject2', 'Content2', 'from2@example.com', ['to2@example.com']) -... ], connection=connection) -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Subject: Subject1 -From: from1@example.com -To: to1@example.com -Date: ... -Message-ID: ... - -Content1 -------------------------------------------------------------------------------- -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Subject: Subject2 -From: from2@example.com -To: to2@example.com -Date: ... -Message-ID: ... - -Content2 -------------------------------------------------------------------------------- -2 - ->>> mail_admins('Subject', 'Content', connection=connection) -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Subject: [Django] Subject -From: root@localhost -To: nobody@example.com -Date: ... -Message-ID: ... - -Content -------------------------------------------------------------------------------- - ->>> mail_managers('Subject', 'Content', connection=connection) -Content-Type: text/plain; charset="utf-8" -MIME-Version: 1.0 -Content-Transfer-Encoding: quoted-printable -Subject: [Django] Subject -From: root@localhost -To: nobody@example.com -Date: ... -Message-ID: ... - -Content -------------------------------------------------------------------------------- - ->>> settings.ADMINS = old_admins ->>> settings.MANAGERS = old_managers - -# Add Cc to the email argument list (#7722) - ->>> email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com'], cc=['cc@example.com']) ->>> message = email.message() ->>> message['Cc'] -'cc@example.com' ->>> email.recipients() -['to@example.com', 'cc@example.com'] - ->>> email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com','other@example.com'], cc=['cc@example.com', 'cc.other@example.com']) ->>> message = email.message() ->>> message['Cc'] -'cc@example.com, cc.other@example.com' ->>> email.recipients() -['to@example.com', 'other@example.com', 'cc@example.com', 'cc.other@example.com'] - ->>> email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com','other@example.com'], cc=['cc@example.com', 'cc.other@example.com'], bcc=['bcc@example.com']) ->>> message = email.message() ->>> email.recipients() -['to@example.com', 'other@example.com', 'cc@example.com', 'cc.other@example.com', 'bcc@example.com'] - ->>> email = EmailMessage('Subject', 'Content', 'from@example.com', ['to@example.com'], cc=['cc@example.com']) ->>> message = email.message() ->>> message.as_string() -'Content-Type: text/plain; charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\nSubject: Subject\nFrom: from@example.com\nTo: to@example.com\nCc: cc@example.com\nDate: ...\nMessage-ID: <...>\n\nContent' - -"""