簡體   English   中英

盡管mail.outbox為空,但AnyMail在Django測試中沒有發送電子郵件?

[英]AnyMail not sending an email in a Django test, despite that mail.outbox is empty?

我想編寫一個Django單元測試,它測試發送的電子郵件是否實際發送(如https://docs.djangoproject.com/en/2.0/topics/testing/tools/#email-services中所述 ) ,但也可以配置為發送實際的電子郵件(以檢查其格式等)。

現在,我只有一個“普通”測試:

from django.test import TestCase, override_settings
from django.core import mail
from lucy_web.test_factories import FamilyFactory, UserFactory
from lucy_web.views.app_invite import send_activation_email


# @override_settings(EMAIL_BACKEND="anymail.backends.mailgun.EmailBackend")
class SendActivationEmailTestCase(TestCase):
    def test_send_activation_email(self):
        user = UserFactory(email='kurt@startwithlucy.com')
        family = FamilyFactory(employee_user=user)
        send_activation_email(user=user)

        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(mail.outbox[0].recipients(), [user.email])
        self.assertIn(
            f"Your activation code is {family.activation_code}.",
            mail.outbox[0].body)

(該測試對某些型號使用factory_boy測試夾具)。 該測試通過,但是如果我在override_settings裝飾器中發表評論,則會收到錯誤消息:

(venv) Kurts-MacBook-Pro-2:lucy-web kurtpeek$ python manage.py test lucy_web.tests.test_app_invite
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_send_activation_email (lucy_web.tests.test_app_invite.SendActivationEmailTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/kurtpeek/Documents/Dev/lucy2/lucy-web/lucy_web/tests/test_app_invite.py", line 15, in test_send_activation_email
    self.assertEqual(len(mail.outbox), 1)
AssertionError: 0 != 1

----------------------------------------------------------------------
Ran 1 test in 0.787s

FAILED (failures=1)
Destroying test database for alias 'default'...

由於mail.outbox為空,我希望我會收到一封實際的電子郵件,但是我檢查了收件箱卻什么也沒收到。

為了完整起見,這是我正在測試的功能:

from django.conf import settings
from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string


def send_activation_email(user):
    context = {
        'activation_code': user.family.activation_code,
        'page_title': 'Lucy Invitation',
        'company': user.family.package.company,
        'num_sessions': user.family.session_count,
        'domain': settings.EMAIL_IMAGE_DOMAIN}

    message_text = render_to_string('email/activation_code.txt', context)
    message_html = render_to_string('email/activation_code.html', context)

    email = EmailMultiAlternatives(
        subject='LUCY Invitation',
        body=message_text,
        from_email=settings.DEFAULT_FROM_EMAIL,
        to=[user.email],
        reply_to=[settings.SUPPORT_EMAIL])
    email.attach_alternative(message_html, "text/html")
    email.send()

為了增加我的困惑,從AnyMail文檔( http://anymail.readthedocs.io/en/stable/tips/test_backend/#testing-your-app )中,似乎AnyMail還在測試中的發件outbox中捕獲了電子郵件。

有人可以指出這里出了什么問題嗎? 為什么我既沒有收到電子郵件,也沒有在mail.outbox看到任何mail.outbox

如果您正在使用Anymail測試EmailBackend, Anymail僅在發件箱中捕獲郵件:

@override_settings(EMAIL_BACKEND="anymail.backends.test.EmailBackend")
#                                                  ^^^^
class SendActivationEmailTestCase(TestCase):
    ...

這不適用於您的情況,因為您使用的是實時Mailgun EmailBackend。 這確實會嘗試發送消息(假設您還正確設置了MAILGUN_API_KEY,並且由於email.send()沒有引發錯誤,您可能會這樣做)。

因此,您需要調查為什么似乎要發送郵件,但您似乎沒有收到它。 開始診斷任何電子郵件發送問題的最佳位置是Mailgun的日志: https ://app.mailgun.com/app/logs/。 (請確保從左側菜單中選擇正確的發送域。)

  • 如果您看到測試消息的“已接受並已發送”事件,則問題出在接收端。 (檢查您的垃圾郵件文件夾。)

  • 如果看到“已接受”,“拒絕”或“失敗”事件,則問題出在Mailgun:Anymail正在設法將您的電子郵件發布到Mailgun,但Mailgun拒絕或無法傳遞它。 檢查日志事件以獲取解釋。 (與已驗證的發件人域不匹配的from_email可能是原因。)

  • 如果您甚至在Mailgun的日志中都沒有看到Accepted事件,那么問題就出在Python端:該消息甚至沒有發送到Mailgun。 通過檢查Anymail發送給電子郵件的附件的anymail_status ,您可能可以找到更多信息:

     def send_activation_email(user): # ... email.send() print(email.anymail_status.status) # should be {'queued'} print(email.anymail_status.esp_response.content) # raw Mailgun API response 

如果沒有發現問題的根源,請更新您的問題,以包括原始Mailgun API響應以及Mailgun日志中的任何相關事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM