2010-09-16 133 views
56

測試電子郵件發送的任何提示?除了可能創建一個Gmail帳戶,尤其是接收這些電子郵件?測試電子郵件發送

我想將電子郵件本地存儲在發送文件夾中。

+0

主持人:請鎖定這個問題。答案中增加了大量垃圾郵件,提出的解決方案非常複雜以促進外部服務。 – nemesisdesign 2018-02-18 15:59:00

回答

31

您可以使用file backend for sending emails這是一個非常方便的開發和測試解決方案;電子郵件不會發送,但存儲在您可以指定的文件夾中!

+1

有關電子郵件後端的更多信息:https://docs.djangoproject.com/en/dev/topics/email/#email-backends。 有時候,即使是簡單的控制檯後端也是足夠的。 – Jeewes 2014-05-14 19:26:56

4

對於不需要發送附件的任何項目,我用django-mailer,它在隊列中結束了,直到我觸發其發送所有出站電子郵件的利益,甚至後他們已經被髮送,然後他們被記錄下來 - 所有這些都可以在管理員中看到,這樣就可以很容易地快速檢查你的電子郵件代碼試圖發送到intertubes中。

+0

除此之外,由django-mailer創建的消息對象意味着你可以在單元測試中刺激它們(並檢查它們的內容)(我知道測試套件中有出站郵箱支持對於一個虛擬郵箱,但使用Django的郵件不發送郵件,除非管理命令發送它,這意味着你不能使用該郵箱對象) – 2010-09-16 16:38:48

+0

更新,從我原來的回答年齡:https://github.com/SmileyChris/django-mailer-2也支持附件 – 2013-05-04 21:22:14

139

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') 
+3

+1好答案。但是當我不能使用'send_mail'的時候,它對於複雜的情況並不有用。 – santiagobasulto 2013-02-08 19:21:45

+2

更確切地說,文檔在這裏:https://docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend – nimiq 2015-11-30 13:21:30

+2

如果你測試了一個調用send_mail的函數,你會如何做到這一點,無法訪問郵件? – 2017-06-18 02:03:47

1

使用文件後端運作良好,但我覺得有點繁瑣閒逛文件系統看電子郵件。您可以使用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 
4

的Django也有一個內存中的電子郵件後端。更多詳情,請參閱In-memory backend下的文檔。這在Django 1.6中是存在的,不知道它是否存在於任何早期的東西中。

-1

使用Maildump。

https://github.com/ThiefMaster/maildump

MailDump是真棒MailCatcher工具的基於Python的克隆。其 的目的是爲開發者提供一種讓應用程序發送電子郵件 的方式,而無需將實際的電子郵件發送給任何人。另外,懶惰的 開發人員可能更喜歡使用真實的SMTP服務器,因爲它設置起來更簡單快捷。

但是它需要Python 2

6

如果你到單元測試的最佳解決方案就是使用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 
0

我的解決方案是將內容寫入html文件。這樣可以幫助您瞭解電子郵件的外觀。我把它留在這裏htmlfilebased.EmailBackend

其他提示:您可以使用django email template editor,它可以幫助您編輯您的電子郵件模板與零內聯CSS。

0

使用MailHog

通過MailCatcher的啓發,更容易安裝。

使用Go構建 - MailHog無需在多個平臺上安裝即可運行。


此外,它有一個名爲吉姆,則MailHog混沌猴組件,它使您能夠測試各種問題發送電子郵件發生的事情:

能有什麼吉姆做?

  • 拒絕連接
  • 限速連接
  • 拒絕認證
  • 拒絕發件人
  • 拒絕收件人

瞭解更多關於它here


(不像原來mailcatcher,這failed on me when sending emails with emoji, encoded in UTF-8,它並沒有真正固定在當前版本中,MailHog只是工作。)

0

爲什麼不繼承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環路(從聽停止服務器)。

0

如果您有TomCat服務器或其他servlet引擎,那麼一個很好的方法是「Post Hoc」,它是一個小型服務器,它看起來像應用程序一樣完全像SMTP服務器,但它包含一個用戶界面,允許您可以查看和檢查發送的電子郵件。它是開源的,免費提供。

搜尋在:Post Hoc GitHub Site

查看博客文章:PostHoc: Testing Apps that Send Email

0

https://websocket.email提供了一種簡單的方法來測試電子郵件以最小的設置發送(你甚至不需要一個賬戶)。