測試電子郵件發送
回答
您可以使用file backend for sending emails這是一個非常方便的開發和測試解決方案;電子郵件不會發送,但存儲在您可以指定的文件夾中!
有關電子郵件後端的更多信息:https://docs.djangoproject.com/en/dev/topics/email/#email-backends。 有時候,即使是簡單的控制檯後端也是足夠的。 – Jeewes 2014-05-14 19:26:56
爲測試目的修補SMTPLib可以幫助測試發送郵件而不發送郵件。
對於不需要發送附件的任何項目,我用django-mailer,它在隊列中結束了,直到我觸發其發送所有出站電子郵件的利益,甚至後他們已經被髮送,然後他們被記錄下來 - 所有這些都可以在管理員中看到,這樣就可以很容易地快速檢查你的電子郵件代碼試圖發送到intertubes中。
除此之外,由django-mailer創建的消息對象意味着你可以在單元測試中刺激它們(並檢查它們的內容)(我知道測試套件中有出站郵箱支持對於一個虛擬郵箱,但使用Django的郵件不發送郵件,除非管理命令發送它,這意味着你不能使用該郵箱對象) – 2010-09-16 16:38:48
更新,從我原來的回答年齡:https://github.com/SmileyChris/django-mailer-2也支持附件 – 2013-05-04 21:22:14
Django測試框架有一些內置的幫助程序來幫助您測試e-mail service。從文檔
例(短版):
from django.core import mail
from django.test import TestCase
class EmailTest(TestCase):
def test_send_email(self):
mail.send_mail('Subject here', 'Here is the message.',
'[email protected]', ['[email protected]'],
fail_silently=False)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Subject here')
+1好答案。但是當我不能使用'send_mail'的時候,它對於複雜的情況並不有用。 – santiagobasulto 2013-02-08 19:21:45
更確切地說,文檔在這裏:https://docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend – nimiq 2015-11-30 13:21:30
如果你測試了一個調用send_mail的函數,你會如何做到這一點,無法訪問郵件? – 2017-06-18 02:03:47
使用文件後端運作良好,但我覺得有點繁瑣閒逛文件系統看電子郵件。您可以使用mailcatcher,https://github.com/sj26/mailcatcher來捕獲電子郵件並將其顯示在Web UI中。
要mailcatcher使用Django的,你需要添加類似以下內容到你的settings.py:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = '127.0.0.1'
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''
EMAIL_PORT = 1025
EMAIL_USE_TLS = False
的Django也有一個內存中的電子郵件後端。更多詳情,請參閱In-memory backend下的文檔。這在Django 1.6中是存在的,不知道它是否存在於任何早期的東西中。
使用Maildump。
https://github.com/ThiefMaster/maildump
MailDump是真棒MailCatcher工具的基於Python的克隆。其 的目的是爲開發者提供一種讓應用程序發送電子郵件 的方式,而無需將實際的電子郵件發送給任何人。另外,懶惰的 開發人員可能更喜歡使用真實的SMTP服務器,因爲它設置起來更簡單快捷。
但是它需要Python 2
如果你到單元測試的最佳解決方案就是使用Django提供的In-memory backend。
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
以使用它作爲py的情況。測試夾具
@pytest.fixture(autouse=True)
def email_backend_setup(self, settings):
settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
在每個試驗中,mail.outbox
與服務器復位,所以有測試之間沒有副作用。
from django.core import mail
def test_send(self):
mail.send_mail('subject', 'body.', '[email protected]', ['[email protected]'])
assert len(mail.outbox) == 1
def test_send_again(self):
mail.send_mail('subject', 'body.', '[email protected]', ['[email protected]'])
assert len(mail.outbox) == 1
我的解決方案是將內容寫入html文件。這樣可以幫助您瞭解電子郵件的外觀。我把它留在這裏htmlfilebased.EmailBackend。
其他提示:您可以使用django email template editor,它可以幫助您編輯您的電子郵件模板與零內聯CSS。
使用MailHog
通過MailCatcher的啓發,更容易安裝。
使用Go構建 - MailHog無需在多個平臺上安裝即可運行。
此外,它有一個名爲吉姆,則MailHog混沌猴組件,它使您能夠測試各種問題發送電子郵件發生的事情:
能有什麼吉姆做?
- 拒絕連接
- 限速連接
- 拒絕認證
- 拒絕發件人
- 拒絕收件人
瞭解更多關於它here。
(不像原來mailcatcher,這failed on me when sending emails with emoji, encoded in UTF-8,它並沒有真正固定在當前版本中,MailHog只是工作。)
爲什麼不繼承smtpd.SMTPServer
開始自己的非常簡單的SMTP服務器和threading.Thread
:每當你的SMTP服務器接收郵件請求
class TestingSMTPServer(smtpd.SMTPServer, threading.Thread):
def __init__(self, port=25):
smtpd.SMTPServer.__init__(
self,
('localhost', port),
('localhost', port),
decode_data=False
)
threading.Thread.__init__(self)
def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):
self.received_peer = peer
self.received_mailfrom = mailfrom
self.received_rcpttos = rcpttos
self.received_data = data
def run(self):
asyncore.loop()
process_message被調用時,你可以做你想做的任何存在。
在測試代碼,做這樣的事情:
smtp_server = TestingSMTPServer()
smtp_server.start()
do_thing_that_would_send_a_mail()
smtp_server.close()
self.assertIn(b'hello', smtp_server.received_data)
只記得close()
的asyncore.dispatcher
通過調用smtp_server.close()
結束asyncore環路(從聽停止服務器)。
如果您有TomCat服務器或其他servlet引擎,那麼一個很好的方法是「Post Hoc」,它是一個小型服務器,它看起來像應用程序一樣完全像SMTP服務器,但它包含一個用戶界面,允許您可以查看和檢查發送的電子郵件。它是開源的,免費提供。
https://websocket.email提供了一種簡單的方法來測試電子郵件以最小的設置發送(你甚至不需要一個賬戶)。
- 1. 從測試發送電子郵件
- 2. 測試電子郵件發送? - Python/Django
- 3. Django測試發送電子郵件
- 4. 電子郵件發送集成測試
- 5. 檢測電子郵件發送的電子郵件客戶端
- 6. 測試發送電子郵件沒有電子郵件服務器
- 7. 發送電子郵件操作不發送電子郵件
- 8. PHP發送電子郵件多次發送電子郵件
- 9. Laravel單元測試如何使用電子郵件測試事件而不發送電子郵件
- 10. JVM嘗試發送電子郵件
- 11. 試圖與Python發送電子郵件
- 12. Python:試圖發送電子郵件href
- 13. 錯誤嘗試發送電子郵件
- 14. 調試:用PHP發送電子郵件
- 15. 測試事件在Laravel發送電子郵件
- 16. 在Hudson發送測試郵件時發生錯誤電子郵件通知
- 17. 確定電子郵件發件人併發送電子郵件
- 18. 發送電子郵件Godaddy
- 19. 發送電子郵件proble
- 20. PHP發送電子郵件
- 21. 發送電子郵件nodemailer
- 22. aspx:發送電子郵件
- 23. 發送電子郵件
- 24. django發送電子郵件
- 25. IIS7 - 發送電子郵件
- 26. SparkPost發送電子郵件
- 27. 發送電子郵件
- 28. 發送電子郵件Progrmmatically
- 29. 發送電子郵件?
- 30. 發送電子郵件
主持人:請鎖定這個問題。答案中增加了大量垃圾郵件,提出的解決方案非常複雜以促進外部服務。 – nemesisdesign 2018-02-18 15:59:00