2011-01-09 12 views
60

Ho un'applicazione Django che invia un'email. Il server di produzione ha un server di posta elettronica, ma la mia casella locale no. Mi piacerebbe essere in grado di testare l'invio di e-mail localmente. C'è un modo in cui posso avere Django non inviarlo tramite il server di posta elettronica e stampare semplicemente su un file o una console?Test di invio e-mail senza server e-mail

+0

Il sistema operativo della tua casella locale potrebbe essere una cosa utile da sapere qui ... In realtà non è necessario un server di posta elettronica sulla scatola, tutto ciò che serve è una connessione di rete a un server di posta elettronica tramite la porta SMTP ... e possibile utente/password. – Spacedman

+0

possibile duplicato di [Dummy SMTP Server per testare le app che inviano email] (http://stackoverflow.com/questions/1006650/dummy-smtp-server-for-testing-apps-that-send-email) –

risposta

113

Puoi configure your application to use the Console Backend per l'invio di e-mail. Scrive le e-mail allo standard invece di inviarle.

Cambia la tua settings.py per includere questa linea:

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

Non dimenticare di rimuoverlo per la produzione.

+18

Meglio ancora, mettilo in un file di impostazioni di sviluppo e non aggiungerlo alla produzione. – leech

+2

O, ancora meglio, [farlo con le variabili di ambiente] (http:/12/1994.net/config). – meshy

+1

Se stai usando ['mail_admins'] (https://docs.djangoproject.com/en/stable/topics/email/#mail-admins), ricorda di impostare [' ADMINS'] (https: // docs .djangoproject.com/it/stable/ref/settings/# std: setting-ADMINS) a qualcosa, altrimenti niente verrà stampato su stdout. Allo stesso modo per 'mail_managers'. – Flimm

58

Python ha un piccolo server SMTP built-in. Si può iniziare in una seconda console con questo comando:

python -m smtpd -n -c DebuggingServer localhost:1025 

Questo sarà sufficiente stampare tutti i messaggi inviati al localhost:1025 nella console.

è necessario configurare Django per utilizzare questo server nel settings.py:

EMAIL_HOST = 'localhost' 
EMAIL_PORT = 1025 
+0

Nota che il tuo l'app può generare un'eccezione se tenta di inviare un'e-mail quando il server di posta elettronica non è avviato. 'fail_silently = False' è il valore predefinito per' send_mail'. –

+0

Mentre la risposta di Daniel Hepper è indubbiamente quella corretta rispetto alla domanda posta, mi piace questa risposta meglio perché è una soluzione generale che funziona indipendentemente dall'ambiente. (Upvotes su entrambi però, ovviamente.) – Teekin

29

È possibile configurare l'applicazione per scrivere e-mail su file temporanei invece di inviarli (simile alla risposta di Daniel Hepper).

EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' 
EMAIL_FILE_PATH = 'tmp/email-messages/' 

Questo salva ogni nuovo messaggio come un file separato. Utile se invii un sacco di email e non vuoi dover usare lo scrollback.

+0

Questo è davvero fantastico da sapere. Grazie. – Teekin

27

Se i test si estendono da django.test.testcases.TestCase, nulla deve essere fatto. Django sostituirà l'EmailBackend in uno "speciale". Quindi è possibile verificare che cosa sarebbe era stato inviato in questo modo:

def testMethodThatSendAEmail(self): 
    ... 
    from django.core import mail 
    object.method_that_send_email(to='[email protected]') 
    self.assertEqual(len(mail.outbox), 1) 
    self.assertEqual(mail.outbox[0].to, ['[email protected]']) 
    ...#etc 

L'oggetto posta in uscita è un oggetto speciale che vengono iniettati nella posta quando si esegue test di manage.py pitone.

11

C'è un app freddo per questo Caktus https://github.com/caktus/django-email-bandit Basta aggiungere questo al file settings.py:

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend' 
BANDIT_EMAIL = '[email protected]' 

in cima alla vostra e-mail e-mail setttings..All sarà deviato a 'your_email @ esempio .com'

felice codifica ...

7

Questa elabora la risposta da Benjamin. Un modo per testare le e-mail se non ho un server di posta locale come Postfix, Sendmail o Exim installato è di eseguire il server di posta Python. È possibile eseguire sulla porta 25 con sudo, o semplicemente utilizzare una porta> 1024 (porte riservate):

python -m smtpd -n -c DebuggingServer localhost:1025 
#sudo python -m smtpd -n -c DebuggingServer localhost:25 

Per il test con il codice di Django applicazione corrente, è possibile modificare settings.py temporaneamente per includere questo al botom:

EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD = 'localhost', 1025, None, None 

Adesso prova le e-mail o puoi farlo in ./manage.shell py in un'altra finestra del terminale in questo modo:

python manage.py shell 

e incollare questo codice per inviare una e-mail:

from django.core.mail import send_mail​ 
send_mail('Subject here', 'Here is the message.', '[email protected]',['[email protected]'], fail_silently=False) 

Non c'è bisogno di utilizzare qualsiasi email reali in quanto vedrete tutto nel vostro terminale. Puoi scaricarlo nel contenitore appropriato come .html per ulteriori test.