2010-09-16 15 views
56

wszelkie wskazówki dotyczące testowania wysyłania wiadomości e-mail? Poza tworzeniem konta w Gmailu, zwłaszcza w przypadku otrzymywania tych e-maili?Testowanie wysyłania wiadomości e-mail

Chciałbym może przechowywać wiadomości e-mail lokalnie, w folderze, ponieważ są one wysyłane.

+0

Moderatorzy: proszę zablokować to pytanie. W odpowiedziach dodaje się dużo spamu, proponując rozwiązania, które są niedorzecznie skomplikowane, tylko po to, aby promować usługi zewnętrzne. – nemesisdesign

Odpowiedz

31

Możesz użyć file backend for sending emails, który jest bardzo przydatnym rozwiązaniem do programowania i testowania; e-maile nie są wysyłane, ale przechowywane w folderze, który możesz podać!

+1

Więcej informacji o pocztach elektronicznych: https://docs.djangoproject.com/en/dev/topics/email/#email-backends. Czasami wystarczy nawet prosty backend konsoli. – Jeewes

4

Dla każdego projektu, który nie wymaga wysyłania załączników, używam django-mailer, który ma korzyść wszystkich wiadomości wychodzących kończących się w kolejce, dopóki nie wywoła ich wysyłania, a nawet po zostały wysłane, są następnie rejestrowane - wszystko to jest widoczne w Administratorze, dzięki czemu można szybko sprawdzić, co kod e-mail próbuje wysłać do interaterów.

+0

Co więcej, obiekty Message utworzone przez django-mailer oznaczają, że możesz je również prodować (i sprawdzać ich zawartość) również w testach jednostkowych (wiem, że w pakiecie testów jest obsługa wychodzącej skrzynki pocztowej dla fałszywej skrzynki pocztowej, ale używanie django-mailer nie wysyła poczty, chyba że komenda zarządzania ją wyśle, co oznacza, że ​​nie możesz użyć tego obiektu skrzynki pocztowej). –

+0

Aktualizacja, wiek z mojej oryginalnej odpowiedzi: https://github.com/SmileyChris/django-mailer-2 obsługuje także załączniki. –

139

Framework testowy Django ma wbudowanych pomocników, którzy pomogą Ci w testowaniu e-mail service.

Przykład z docs (krótka wersja):

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 Dobra odpowiedź. Ale nie jest to użyteczne w skomplikowanych przypadkach, gdy 'send_mail' nie może być użyty. – santiagobasulto

+2

Dokładniej dokument jest tutaj: https://docs.djangoproject.com/en/1.8/topics/email/#in-memory-backend – nimiq

+2

Jak to zrobić, jeśli testujesz funkcję, która wywołuje send_mail i dlatego możesz uzyskać dostęp do 'mail'? –

1

Korzystanie backend pliku działa dobrze, ale uważam, że to trochę kłopotliwe, aby grzebać w systemie plików, aby spojrzeć na e-maile. Możesz użyć narzędzia mailcatcher, https://github.com/sj26/mailcatcher, do przechwytywania wiadomości e-mail i wyświetlania ich w interfejsie internetowym.

Aby korzystać mailcatcher z Django trzeba dodać coś takiego do swojej 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 ma również w pamięci email backend. Więcej szczegółów w dokumentach pod numerem In-memory backend. Jest to obecne w Django 1.6, nie wiem, czy jest obecny w czymkolwiek wcześniej.

-1

Użyj Maildump.

https://github.com/ThiefMaster/maildump

MailDump jest klonem python oparte na niesamowite narzędzie MailCatcher. Jego celem jest zapewnienie programistom sposobu pozwalającego aplikacjom na wysyłanie wiadomości e-mail bez wysyłania rzeczywistych wiadomości e-mail do nikogo. Dodatkowo programiści leniwi mogą preferować ten program na prawdziwym serwerze SMTP, po prostu dla ułatwienia i przyspieszenia konfiguracji.

Jednak wymaga to Python 2.

6

Jeśli do jednostki badanie najlepszym rozwiązaniem jest użycie In-memory backend dostarczone przez Django.

EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' 

Zapoznaj się z przypadkiem użycia go jako py.Test Oprawa

@pytest.fixture(autouse=True) 
def email_backend_setup(self, settings): 
    settings.EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend' 

W każdym teście, mail.outbox jest resetowany z serwerem, więc nie ma żadnych skutków ubocznych między testami.

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

Moje rozwiązanie polega na zapisywaniu treści do pliku html. W ten sposób możesz zobaczyć, jak wyglądają wiadomości e-mail. Zostawiam to tutaj htmlfilebased.EmailBackend.

Inna porada: można użyć django email template editor, która może pomóc w edycji szablonu wiadomości e-mail z zerowym wbudowanym css.

0

Zastosowanie MailHog

Zainspirowany MailCatcher, łatwiejsze do zainstalowania.

Zbudowany z Go - MailHog działa bez instalacji na wielu platformach.


Również posiada komponent zwany Jim The MailHog Chaos małpa, który pozwala testować wysyłanie e-maili z różnymi problemami dzieje:

Co może Jim zrobić?

  • Odrzuć przyłączy
  • połączeń Oceń granicznych
  • Odrzuć uwierzytelniania
  • Odrzuć nadawców
  • Odrzuć odbiorców

Czytaj więcej na ten temat here.


(W przeciwieństwie do oryginalnego mailcatcher, który failed on me when sending emails with emoji, encoded in UTF-8 i naprawdę nie było ustalonej w aktualnym wydaniu MailHog prostu działa.)

0

Dlaczego nie założyć własną naprawdę prosty serwer SMTP przez dziedziczą z smtpd.SMTPServer i threading.Thread:

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 nazywa gdy serwer SMTP otrzyma wniosek mail, możesz robić, co chcesz tam.

W kodzie testowym, zrób coś takiego:

smtp_server = TestingSMTPServer() 
smtp_server.start() 
do_thing_that_would_send_a_mail() 
smtp_server.close() 
self.assertIn(b'hello', smtp_server.received_data) 

Wystarczy pamiętać, aby close()asyncore.dispatcher wywołując smtp_server.close() aby zakończyć pętlę asyncore (zatrzymać serwer ze słuchania).

0

Jeśli masz serwer TomCat dostępny lub inny silnik serwletu, dobrym rozwiązaniem jest "Post Hoc", który jest małym serwerem, który wygląda na aplikację dokładnie tak, jak serwer SMTP, ale zawiera interfejs użytkownika, który pozwala do przeglądania i sprawdzania wysłanych wiadomości e-mail. Jest to oprogramowanie otwarte i dostępne bezpłatnie.

Znajdź to na: Post Hoc GitHub Site

Zobacz posta: PostHoc: Testing Apps that Send Email

0

https://websocket.email zapewnia prosty sposób przetestować wysyłanie wiadomości e-mail przy minimalnej konfiguracji (nawet nie trzeba konta).

Powiązane problemy