由于主题中的换行符,独立调用send_mail函数将导致BadHeaderError异常。
我希望这个test_newline_causes_exception也会失败,但事实并非如此。这是在Django 1.3中。有什么想法吗?
from django.core.mail import send_mail
from django.utils import unittest
class EmailTestCase(unittest.TestCase):
def test_newline_causes_exception(self):
send_mail('Header\nInjection', 'Here is the message.', 'from@example.com',
['to@example.com'], fail_silently=False)
编辑:此新测试表明,在测试中使用send_mail时,不会调用标头检查代码(django.core.mail.message.forbid_multi_line_headers)。
from django.core.mail import send_mail, BadHeaderError, outbox
from django.utils import unittest
class EmailTestCase(unittest.TestCase):
def test_newline_in_subject_should_raise_exception(self):
try:
send_mail('Subject\nhere', 'Here is the message.',
'from@example.com', ['to@example.com'], fail_silently=False)
except BadHeaderError:
raise Exception
self.assertEqual(len(outbox), 1)
self.assertEqual(outbox[0].subject, 'Subject here')
结果:
AssertionError: 'Subject\nhere' != 'Subject here'
答案 0 :(得分:2)
你真的没有测试任何东西。测试意味着检查BadHeaderError
是否已被提升。如果断言测试为假,则测试将失败。你可以这样做 -
def test_newline_causes_exception(self)
error_occured = False
try:
send_mail('Header\nInjection', 'Here is the message.', 'from@example.com',
['to@example.com'], fail_silently=False)
except BadHeaderError:
error_occured = True
self.assertTrue(error_ocurred)
我还没有测试过。但它应该有用。
PS:from django.core.mail import send_mail, BadHeaderError
答案 1 :(得分:2)
我发现这个问题已在Django 1.5中得到修复。测试电子邮件后端(locmem.py)现在执行与标准后端相同的标头清理。
https://code.djangoproject.com/ticket/18861
https://github.com/django/django/commit/8599f64e54adfb32ee6550ed7a6ec9944034d978
修改强>
我找到了在Django版本< 1.5中测试标头验证的解决方法。
使用get_connection方法加载控制台后端,后端执行与生产后端相同的验证。
感谢亚历山大阿法纳耶夫指出我正确的方向。
connection = get_connection('django.core.mail.backends.console.EmailBackend')
send_mail('Subject\nhere',
'Here is the message.',
'from@example.com',
['to@example.com'],
fail_silently=False,
connection=connection)