2

そこで、smtplib を使用して、ユーザーが最初にログインしたときにウェルカム メールを送信する簡単なメール サービスを作成しました。

def send_email(nickname, email):
    msg = MIMEMultipart('alternative')

    config = read_config_file(MAIL_CONFIG_PATH)
    sen = config.get('gmail_credentials', 'email')
    pwd = config.get('gmail_credentials', 'password')

    server = None
    try:
        server = smtplib.SMTP('smtp.gmail.com', 587) 
        server.ehlo()
        server.starttls()
        server.login(sen, pwd)
        server.sendmail(sen, [email], msg.as_string())
        return 'Sent!'

    finally:
        if server:
        server.quit()

偽の smtp サーバーを使用できることがわかりました。

sudo python -m smtpd -n -c DebuggingServer localhost:25

しかし、このようなものをコードにどのように実装する必要があるかはまだわかりません。テスト中に SMTP サーバーを実行し、実際の呼び出しのために GMAIL サーバーに接続するように API を変更するにはどうすればよいですか? また、サーバーで SMTP サーバーを実行する init スクリプトはありますか (これは AWS EC2 にデプロイされます)。

4

3 に答える 3

1

同じ問題でこの古いチケットに出くわした人には、標準ライブラリとの統合テストを書きたかったので、上記の解決策はうまくいきませんでした。単体テスト コード内でローカルにデバッグ サーバーをセットアップすることも少し難しく、starttls をサポートしていないと言われています。結局、私はこれに行きました。

import smtplib
from unittest import TestCase

class TestSMTP(TestCase)

    ...
    setup etc.

    def test_smtp_connection(self):
        # connect to actual host on actual port
        smtp = smtp.SMTP(host, port)
        smtp.starttls()

        # check we have an open socket
        self.assertIsNotNone(smtp.sock)

        # run a no-operation, which is basically a server-side pass-through
        self.assertEqual(smtp.noop(), (250, '2.0.0 OK'))

        # assert disconnected
        self.assertEqual(smtp.quit(), (221, '2.0.0 Service closing transmission channel'))
        self.assertIsNone(smtp.sock)

これらは統合テストであり、電子メール サーバーが機能していることを確認するために必要なことはこれだけです。他のすべては、smtp.SMTP渡されたものをモックしてキャプチャしsendmail、その内容を検証することで実行できます。smtp の単体テストではなく、アプリケーションの単体テストを行っています。

于 2021-02-16T12:21:23.270 に答える