Skip to main content
 首页 » 编程设计

python之测试 python smtp 电子邮件服务

2025年05月04日27grandyang

因此,我使用 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 

但是我仍然不确定我应该如何在我的代码中实现这样的东西。如何更改我的 API 以便它在测试期间运行 SMTP 服务器并连接到 GMAIL 服务器以进行实际调用?是否有初始化脚本可以在我们的服务器上运行 SMTP 服务器(这将部署在 AWS EC2 上)。

请您参考如下方法:

对于遇到同样问题的这张旧票的任何人,我想用标准库编写集成测试,所以上面的解决方案对我不起作用。在单元测试代码中本地设置调试服务器也有点棘手,据说不支持 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 进行单元测试,而是在对您的应用程序进行单元测试。