2011-01-09 19 views
60

電子メールを送信するDjangoアプリケーションがあります。プロダクションサーバーには電子メールサーバーがありますが、ローカルボックスにはありません。私は電子メールの送信をローカルでテストできるようにしたいと考えています。私はdjangoが電子メールサーバーを介して送信せず、単にファイルやコンソールに出力することができる方法はありますか?電子メールサーバーを使用しない電子メールのテスト

+0

あなたのローカルボックスのオペレーティングシステムはここで知っておくと便利かもしれません...あなたは実際にボックスにメールサーバーを必要とせず、SMTPポート経由で電子メールサーバーへのネットワーク接続が必要です...と可能なユーザー/パスワード。 – Spacedman

+0

[電子メールを送信するアプリケーションをテストするためのダミーSMTPサーバー]の複製可能性(http://stackoverflow.com/questions/1006650/dummy-smtp-server-for-testing-apps-that-send-email) –

答えて

113

することはできconfigure your application to use the Console Backend電子メールを送信するために:

はあなたのsettings.pyにこのサーバを使用するためにはDjangoを設定する必要があります。電子メールを送信するのではなく、標準出力に書き込みます。

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

は生産のためにそれを削除することを忘れないでください:

は、この行を含めるために、あなたのsettings.pyを変更

+18

まだ、それを開発の設定ファイルに入れ、それを本番に追加しないでください。 – leech

+2

さらに良いことには、[環境変数で行う](http://12factor.net/config)です。 – meshy

+1

['mail_admins'](https://docs.djangoproject.com/en/stable/topics/email/#mail-admins)を使用している場合は、[' ADMINS'](https:// docs .djangoproject.com/ja/stable/ref/settings /#std:setting-ADMINS)を何かに置き換えてください。そうしないと、stdoutには何も印刷されません。 'mail_managers'の場合も同様です。 – Flimm

58

Pythonには、少しのSMTPサーバーbuilt-inがあります。このコマンドで第2コンソールでそれを起動することができます。

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

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

EMAIL_HOST = 'localhost' 
EMAIL_PORT = 1025 
+0

電子メールサーバーが起動していないときに電子メールを送信しようとすると、アプリが例外をスローする可能性があります。 'fail_silently = False'は' send_mail'のデフォルトです。 –

+0

ダニエル・ヘッパーの答えは間違いなく正しい質問ですが、私はこの答えが気に入っています。これは、環境に関係なく機能する一般的な解決策だからです。しかし、両方の上にupvotesもちろん、。 – Teekin

29

電子メールを送信する代わりに一時ファイルに書き込むようにアプリケーションを設定できます(Daniel Hepperの回答と同様)。

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

これは、新しいメッセージを別々のファイルとして保存します。電子メールのヒープを送信し、スクロールバックを使用したくない場合に便利です。

+0

それは実際には知っていると非常に素晴らしいです。ありがとう。 – Teekin

27

あなたのテストが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 

送信トレイのオブジェクトは、 のpython manage.pyテストが実行されたときに、メールに注入を受ける特殊なオブジェクトです。

11

このためのクールなアプリはちょうどあなたのsettings.pyファイルに以下を追加caktus https://github.com/caktus/django-email-bandit である:例えば、@ your_email」に転用される電子メールsetttings..Allメールの上に

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

.COM」

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

7

これはベンジャミンからの回答について詳しく説明。 postfix、sendmail、eximのようなローカルメールサーバーがない場合、私が電子メールをテストする1つの方法は、python電子メールサーバーを実行することです。あなたは、sudoでポート25でそれを実行し、あるいは単にポート> 1024(予約済みのポート)を使用することができます。

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

現在のDjangoアプリケーションのコードとテストのために、あなたはでこれを含めるために、一時的にsettings.pyを変更することができますbotom:

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

あなたの電子メールをテストするか、./manageでこれを行うことができます。そのような別の端末ウィンドウでPYシェル:

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

端末にあなたはすべてのものが表示されますので、任意の実際の電子メールを使用する必要はありません:

python manage.py shell 

とは、電子メールを送信するために、このコードを貼り付けます。さらなるテストのために、.htmlのような適切なコンテナにそれをダンプすることができます。

関連する問題