電子メールを送信するDjangoアプリケーションがあります。本番サーバーには電子メールサーバーがありますが、ローカルボックスにはありません。ローカルで電子メールの送信をテストできます。 Djangoをメールサーバー経由で送信せず、ファイルまたはコンソールに出力するだけですか?
コンソールバックエンドを使用するようにアプリケーションを構成する 電子メールを送信することができます。電子メールを送信する代わりに標準出力に書き込みます。
次の行を含めるようにsettings.pyを変更します。
EMAIL_BACKEND = 'Django.core.mail.backends.console.EmailBackend'
本番環境で削除することを忘れないでください。
Pythonには小さなSMTPサーバー ビルトイン があります。次のコマンドを使用して、2番目のコンソールで起動できます。
python -m smtpd -n -c DebuggingServer localhost:1025
これは、コンソールのlocalhost:1025
に送信されたすべてのメールを単に印刷します。
settings.py
でこのサーバーを使用するには、Django=)を設定する必要があります。
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='[email protected]')
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].to, ['[email protected]'])
...#etc
Outboxオブジェクトは、python manage.pyテストが実行されたときにメールに挿入される特別なオブジェクトです。
これにはcaktusによるクールなアプリがあります https://github.com/caktus/Django-email-bandit これをsettings.pyファイルに追加するだけです:
EMAIL_BACKEND = 'bandit.backends.smtp.HijackSMTPBackend'
BANDIT_EMAIL = '[email protected]'
メール設定の上。すべてのメールは「[email protected]」に転送されます。
ハッピーコーディング...
これは、ベンジャミンからの答えを詳しく述べています。 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などの適切なコンテナにダンプできます。