首页 > 解决方案 > API调用中Python SMTP连接太慢

问题描述

我对 Python 中的 smtplib 有一个小问题。我目前正在使用 Flask 构建 API,并且正在经历身份验证阶段。理论很简单:我创建了一个通过 json 接受 POST 请求的路由,其中​​包含用户名、密码和电子邮件地址。每次创建新用户时,内部逻辑都会向给定的电子邮件发送基本响应,其中包含激活帐户的密码。一切都很好,但是请求平均需要 7.5 秒,其中大部分是实际的电子邮件传递。

我在每次创建新用户时触发的函数中以这种方式使用 smtp 库:

    def func(*args, **kwargs):  # the arguments are email address from/to and the actual message
        with smtplib.SMTP_SLL('****.mail.com') as smtp:
            smtp.login(ADDRESS, PASSWORD)
            smtp.sendemail(msg)

我的问题是:将 SMTP_SSL 连接分配给函数外部的对象(如下所示)是否可能并且可能更快,以便连接始终打开:

    server = smtplib.SMTP_SSL('****.mail.com')
    server.login(ADDRESS, PASSWORD)

    def func(*args, **kwargs):  # the function doesn't connect everytime
        server.sendemail(msg)

我估计实际连接、验证和登录占用的时间最长。此外,当网站的 Web 服务器运行时,保持 SMTP 连接始终打开可能会出现哪些安全问题?

非常感谢

标签: pythonpython-3.xapiflasksmtplib

解决方案


类似的问题已在

如何在不为每封电子邮件建立连接的情况下通过 SMTP 发送批量电子邮件?

总的来说,我认为这是不明智的。如果您连接到您的 ISP 的 SMTP 服务器,他们不会喜欢永久占用套接字。如果握手需要那么长时间,那么可以合理地猜测他们已经确定了一些负载。

此外,您可能会在一段时间不活动后断开连接。如果你按照你的建议去做,异常处理也会变得棘手。

根据您的环境,如上述讨论中所建议的,您可以将 Postfix 设置为空客户端,并启用连接缓存。这将处理毛茸茸的部分转换为一个专为处理它而设计的软件。

然后,您的网络服务器将使用 smtplib 连接到这个空客户端并发送您的电子邮件。这笔交易几乎是即时的,Postfix 会做它的事情。


推荐阅读