web-dev-qa-db-ja.com

メール送信のテスト

メール送信のテストに関するヒントはありますか?多分 gmail アカウントを作成する以外に、特にそれらのメールを受信するために?

おそらく、送信されたフォルダ内にローカルにメールを保存したいと思います。

72
RadiantHex

メールを送信するためのファイルバックエンド を使用できます。これは開発とテストに非常に便利なソリューションです。メールは送信されませんが、指定可能なフォルダーに保存されます!

35

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')
163
Davor Lucic

単体テストを行う場合、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
12
kiril

使用MailHog

MailCatcherに触発され、インストールが簡単。

Goで構築-MailHogは複数のプラットフォームにインストールせずに実行されます。


また、JimMailHog Chaos Monkey、さまざまな問題が発生したメールの送信をテストできます。

ジムは何ができますか?

  • 接続を拒否する
  • レート制限接続
  • 認証を拒否する
  • 送信者を拒否する
  • 受信者を拒否する

詳細については こちら をご覧ください。


(元のメールキャッチャーとは異なり、 TF-8でエンコードされた絵文字でメールを送信するときに失敗しました そして現在のリリースでは実際に修正されていませんが、MailHogは機能します。)

5
Greg Dubicki

添付ファイルを送信する必要のないプロジェクトでは、 Django-mailer を使用します。これは、送信をトリガーするまで、および送信された後でも送信された後、ログに記録されます。これらはすべて管理画面に表示され、メール送信コードがintertubesに発射しようとしているものを簡単に確認できます。

5
Steve Jalim

Djangoには、メモリ内の電子メールバックエンドもあります。詳細については、ドキュメントの In-memory backend を参照してください。これはDjango 1.6に存在します。1.6より前に存在するかどうかは不明です。

4
Josh K

テスト目的でSMTPLibにパッチを適用すると、メールを送信せずに送信をテストできます。

3
pyfunc

ファイルバックエンドの使用はうまく機能しますが、ファイルシステムを調べて電子メールを見るのは少し面倒です。 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
1
Marc

_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()を呼び出して非同期ループを終了します(サーバーがリッスンするのを停止します) )。

1
frogcoder

私の解決策は、コンテンツをhtmlファイルに書き込むことです。この方法は、メールの外観を確認するのに役立ちます。ここに残します htmlfilebased.EmailBackend

その他のヒント: Django email template editor を使用できます。これにより、インラインCSSを使用せずに電子メールテンプレートを編集できます。

0
Phuong Vu

Tomcatサーバーまたは他のサーブレットエンジンを使用できる場合、ナイスアプローチは「Post Hoc」です。これは、SMTPサーバーとまったく同じようにアプリケーションに見える小さなサーバーですが、ユーザーインターフェイスを表示して、送信された電子メールメッセージを調べます。オープンソースであり、自由に利用できます。

次で見つける: Post Hoc GitHub Site

ブログの投稿を参照してください: PostHoc:メールを送信するアプリのテスト

0
AgilePro

https://websocket.email は、最小限の設定でメール送信をテストする簡単な方法を提供します(アカウントは必要ありません)。

0
Andrew Chambers

ここでいくつかの要素を結び付けると、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"),
0
shacker