python - 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 连接始终打开可能会出现哪些安全问题?
非常感谢
解决方案
类似的问题已在
如何在不为每封电子邮件建立连接的情况下通过 SMTP 发送批量电子邮件?
总的来说,我认为这是不明智的。如果您连接到您的 ISP 的 SMTP 服务器,他们不会喜欢永久占用套接字。如果握手需要那么长时间,那么可以合理地猜测他们已经确定了一些负载。
此外,您可能会在一段时间不活动后断开连接。如果你按照你的建议去做,异常处理也会变得棘手。
根据您的环境,如上述讨论中所建议的,您可以将 Postfix 设置为空客户端,并启用连接缓存。这将处理毛茸茸的部分转换为一个专为处理它而设计的软件。
然后,您的网络服务器将使用 smtplib 连接到这个空客户端并发送您的电子邮件。这笔交易几乎是即时的,Postfix 会做它的事情。
推荐阅读
- mysql - MySQL JSON_EXTRACT 与 LIMIT 和 OFFSET
- visual-studio-code - 如何在 TM 语言中定义正则表达式变量?
- ios - 向一组 UITextField 添加新的“发送事件”时遇到问题
- delphi - 如何防止 Tflowpanel 中的闪烁?
- flutter - 如何创造未来
成为数组可用的常规 int 吗? - python - 尝试从 vba 调用 Python 脚本,但它返回的是数字系列而不是所需的输出
- jupyter-notebook - 如何恢复 Jupyter Notebook 中意外删除的单元格
- git - Git 配置 (git config --list) 我可以删除什么以及如何删除?
- async-await - Svelte {#await}..{:then} 阻止使用新数据复制 html
- java - 我可以将一个流分成多个较小的流吗