web-dev-qa-db-ja.com

メールサーバーなしでメールを送信するテスト

電子メールを送信するDjangoアプリケーションがあります。本番サーバーには電子メールサーバーがありますが、ローカルボックスにはありません。ローカルで電子メールの送信をテストできます。 Djangoをメールサーバー経由で送信せず、ファイルまたはコンソールに出力するだけですか?

65
asawilliams

コンソールバックエンドを使用するようにアプリケーションを構成する 電子メールを送信することができます。電子メールを送信する代わりに標準出力に書き込みます。

次の行を含めるようにsettings.pyを変更します。

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

本番環境で削除することを忘れないでください。

124
Daniel Hepper

Pythonには小さなSMTPサーバー ビルトイン があります。次のコマンドを使用して、2番目のコンソールで起動できます。

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

これは、コンソールのlocalhost:1025に送信されたすべてのメールを単に印刷します。

settings.pyでこのサーバーを使用するには、Django=)を設定する必要があります。

EMAIL_Host = 'localhost'
EMAIL_PORT = 1025
74

アプリケーションを設定して、メールを送信する代わりに一時ファイルに書き出すことができます(Daniel Hepperの回答と同様)。

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

これにより、新しいメッセージが個別のファイルとして保存されます。大量のメールを送信していて、スクロールバックを使用する必要がない場合に便利です。

38

テストがDjango.test.testcases.TestCaseから拡張されている場合、何もする必要はありません。 Djangoは、EmailBackendを「特別な」ものに置き換えます。次に、このように送信されたものをテストできます。

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

Outboxオブジェクトは、python manage.pyテストが実行されたときにメールに挿入される特別なオブジェクトです。

32
Julien Grenier

これにはcaktusによるクールなアプリがあります https://github.com/caktus/Django-email-bandit これをsettings.pyファイルに追加するだけです:

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

メール設定の上。すべてのメールは「[email protected]」に転送されます。

ハッピーコーディング...

11
Njogu Mbau

これは、ベンジャミンからの答えを詳しく述べています。 postfix、sendmail、eximなどのローカルメールサーバーがインストールされていない場合にメールをテストする1つの方法は、pythonメールサーバーを実行することです。ポート25でSudoを実行できます。または単に1024を超えるポートを使用します(予約ポート):

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

現在のDjango=アプリコードでテストするには、bottomにこれを含めるためにsettings.pyを一時的に変更できます。

EMAIL_Host, EMAIL_PORT, EMAIL_Host_USER, EMAIL_Host_PASSWORD = 'localhost', 1025, None, None

メールをテストするか、別のターミナルウィンドウの./manage.py Shellで次のように実行できます。

python manage.py Shell

このコードを貼り付けてメールを送信します。

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

端末にすべてが表示されるため、実際のメールを使用する必要はありません。さらにテストするために、.htmlなどの適切なコンテナにダンプできます。

10
radtek