75

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

4

6 に答える 6

138

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

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

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

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

于 2011-01-09T22:15:30.513 に答える
84

Pythonには小さなSMTPサーバーが組み込まれています。次のコマンドを使用して、2番目のコンソールで起動できます。

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

localhost:1025これにより、コンソールに送信されたすべてのメールが印刷されます。

でこのサーバーを使用するようにDjangoを構成する必要がありますsettings.py

EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
于 2011-01-09T21:47:19.377 に答える
42

電子メールを送信するのではなく、一時ファイルに書き出すようにアプリケーションを構成できます (Daniel Hepper の回答と同様)。

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

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

于 2011-01-09T23:35:39.970 に答える
35

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

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

outbox オブジェクトは、python manage.py テストの実行時にメールに挿入される特別なオブジェクトです。

于 2011-01-12T01:51:28.580 に答える
12

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

EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = 'your_email@example.com'

メール設定に加えて、すべてのメールは「your_email@example.com」に転送されます

幸せなコーディング...

于 2013-10-17T12:22:50.313 に答える