メールを送信する Django アプリケーションがあります。運用サーバーには電子メール サーバーがありますが、私のローカル ボックスにはありません。ローカルでメールの送信をテストできるようにしたいと考えています。django に電子メール サーバー経由で送信させずにファイルまたはコンソールに出力させる方法はありますか?
6 に答える
電子メールの送信にコンソール バックエンドを使用するようにアプリケーションを構成できます。電子メールを送信する代わりに、標準出力に書き込みます。
次の行を含めるように settings.py を変更します。
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
本番用に削除することを忘れないでください。
Pythonには小さなSMTPサーバーが組み込まれています。次のコマンドを使用して、2番目のコンソールで起動できます。
python -m smtpd -n -c DebuggingServer localhost:1025
localhost:1025
これにより、コンソールに送信されたすべてのメールが印刷されます。
でこのサーバーを使用するようにDjangoを構成する必要がありますsettings.py
:
EMAIL_HOST = 'localhost'
EMAIL_PORT = 1025
電子メールを送信するのではなく、一時ファイルに書き出すようにアプリケーションを構成できます (Daniel Hepper の回答と同様)。
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = 'tmp/email-messages/'
これにより、新しいメッセージがそれぞれ別のファイルとして保存されます。大量のメールを送信していて、スクロールバックを使用したくない場合に便利です。
テストが 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 テストの実行時にメールに挿入される特別なオブジェクトです。
これには 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」に転送されます
幸せなコーディング...