メール送信のテストに関するヒントはありますか?多分 gmail アカウントを作成する以外に、特にそれらのメールを受信するために?
おそらく、送信されたフォルダ内にローカルにメールを保存したいと思います。
メールを送信するためのファイルバックエンド を使用できます。これは開発とテストに非常に便利なソリューションです。メールは送信されませんが、指定可能なフォルダーに保存されます!
Djangoテストフレームワークには、テストを支援するヘルパーが組み込まれています 電子メールサービス 。
ドキュメントの例(ショートバージョン):
from Django.core import mail
from Django.test import TestCase
class EmailTest(TestCase):
def test_send_email(self):
mail.send_mail('Subject here', 'Here is the message.',
'[email protected]', ['[email protected]'],
fail_silently=False)
self.assertEqual(len(mail.outbox), 1)
self.assertEqual(mail.outbox[0].subject, 'Subject here')
単体テストを行う場合、Djangoが提供する In-memory backend を使用するのが最適なソリューションです。
EMAIL_BACKEND = 'Django.core.mail.backends.locmem.EmailBackend'
py.testフィクスチャとして使用する場合を考えてみましょう
@pytest.fixture(autouse=True)
def email_backend_setup(self, settings):
settings.EMAIL_BACKEND = 'Django.core.mail.backends.locmem.EmailBackend'
各テストでは、mail.outbox
はサーバーでリセットされるため、テスト間に副作用はありません。
from Django.core import mail
def test_send(self):
mail.send_mail('subject', 'body.', '[email protected]', ['[email protected]'])
assert len(mail.outbox) == 1
def test_send_again(self):
mail.send_mail('subject', 'body.', '[email protected]', ['[email protected]'])
assert len(mail.outbox) == 1
使用MailHog
MailCatcherに触発され、インストールが簡単。
Goで構築-MailHogは複数のプラットフォームにインストールせずに実行されます。
また、Jim、MailHog Chaos Monkey、さまざまな問題が発生したメールの送信をテストできます。
ジムは何ができますか?
- 接続を拒否する
- レート制限接続
- 認証を拒否する
- 送信者を拒否する
- 受信者を拒否する
詳細については こちら をご覧ください。
(元のメールキャッチャーとは異なり、 TF-8でエンコードされた絵文字でメールを送信するときに失敗しました そして現在のリリースでは実際に修正されていませんが、MailHogは機能します。)
添付ファイルを送信する必要のないプロジェクトでは、 Django-mailer を使用します。これは、送信をトリガーするまで、および送信された後でも送信された後、ログに記録されます。これらはすべて管理画面に表示され、メール送信コードがintertubesに発射しようとしているものを簡単に確認できます。
Djangoには、メモリ内の電子メールバックエンドもあります。詳細については、ドキュメントの In-memory backend を参照してください。これはDjango 1.6に存在します。1.6より前に存在するかどうかは不明です。
テスト目的でSMTPLibにパッチを適用すると、メールを送信せずに送信をテストできます。
ファイルバックエンドの使用はうまく機能しますが、ファイルシステムを調べて電子メールを見るのは少し面倒です。 mailcatcher https://github.com/sj26/mailcatcher を使用して、電子メールをキャプチャし、Web UIに表示できます。
Djangoでmailcatcherを使用するには、次のようなものをsettings.pyに追加する必要があります。
EMAIL_BACKEND = 'Django.core.mail.backends.smtp.EmailBackend'
EMAIL_Host = '127.0.0.1'
EMAIL_Host_USER = ''
EMAIL_Host_PASSWORD = ''
EMAIL_PORT = 1025
EMAIL_USE_TLS = False
_smtpd.SMTPServer
_ および _threading.Thread
_ から継承して、本当にシンプルなSMTPサーバーを起動してみませんか。
_class TestingSMTPServer(smtpd.SMTPServer, threading.Thread):
def __init__(self, port=25):
smtpd.SMTPServer.__init__(
self,
('localhost', port),
('localhost', port),
decode_data=False
)
threading.Thread.__init__(self)
def process_message(self, peer, mailfrom, rcpttos, data, **kwargs):
self.received_peer = peer
self.received_mailfrom = mailfrom
self.received_rcpttos = rcpttos
self.received_data = data
def run(self):
asyncore.loop()
_
process_messageは、SMTPサーバーがメール要求を受信するたびに呼び出され、そこで何でもできます。
テストコードで、次のようなことを行います。
_smtp_server = TestingSMTPServer()
smtp_server.start()
do_thing_that_would_send_a_mail()
smtp_server.close()
self.assertIn(b'hello', smtp_server.received_data)
_
忘れないでください close()
the _asyncore.dispatcher
_smtp_server.close()
を呼び出して非同期ループを終了します(サーバーがリッスンするのを停止します) )。
私の解決策は、コンテンツをhtmlファイルに書き込むことです。この方法は、メールの外観を確認するのに役立ちます。ここに残します htmlfilebased.EmailBackend 。
その他のヒント: Django email template editor を使用できます。これにより、インラインCSSを使用せずに電子メールテンプレートを編集できます。
Tomcatサーバーまたは他のサーブレットエンジンを使用できる場合、ナイスアプローチは「Post Hoc」です。これは、SMTPサーバーとまったく同じようにアプリケーションに見える小さなサーバーですが、ユーザーインターフェイスを表示して、送信された電子メールメッセージを調べます。オープンソースであり、自由に利用できます。
次で見つける: Post Hoc GitHub Site
ブログの投稿を参照してください: PostHoc:メールを送信するアプリのテスト
https://websocket.email は、最小限の設定でメール送信をテストする簡単な方法を提供します(アカウントは必要ありません)。
ここでいくつかの要素を結び付けると、filebased.EmailBackend
。これにより、便利なタイムスタンプ付きのファイル名を持つ個々のログファイルにリンクするリストビューがレンダリングされます。リスト内のリンクをクリックすると、そのメッセージがブラウザーに表示されます(生):
設定
EMAIL_BACKEND = "Django.core.mail.backends.filebased.EmailBackend"
EMAIL_FILE_PATH = f"{MEDIA_ROOT}/email_out"
表示
import os
from Django.conf import settings
from Django.shortcuts import render
def mailcheck(request):
path = f"{settings.MEDIA_ROOT}/email_out"
mail_list = os.listdir(path)
return render(request, "mailcheck.html", context={"mail_list": mail_list})
テンプレート
{% if mail_list %}
<ul>
{% for msg in mail_list %}
<li>
<a href="{{ MEDIA_URL }}email_out/{{msg}}">{{ msg }}</a>
</li>
{% endfor %}
</ul>
{% else %}
No messages found.
{% endif %}
rls
path("mailcheck/", view=mailcheck, name="mailcheck"),