You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python+Gmail批量发邮件出现SMTPServerDisconnected错误问题咨询

报错产生原因

  • Gmail SMTP服务的限流策略触发:Gmail对第三方客户端发送邮件的速率有严格限制,短时间内连续发送大量邮件会被判定为垃圾邮件行为,服务器主动断开连接。你当前代码没有设置发送间隔,循环连续发送104封很容易触发该限制。
  • 认证方式不兼容:当前Gmail早已不支持直接用账号原始密码进行SMTP登录,必须先开启账号的两步验证,再生成专属应用密码用于SMTP登录,否则也会出现连接被强制断开的问题。
  • 环境版本问题:你使用的是Python 2.7版本,该版本早已停止维护,内置的smtplib库存在连接保持的已知问题,也可能引发连接异常断开。

区分已发送/未发送邮箱的实现方式

在发送循环中增加异常捕获和状态持久化逻辑即可,修改思路如下:

  1. 初始化两个空列表分别存储发送成功、失败的邮箱地址
  2. 给server.sendmail包裹try-except块,执行成功就将当前邮箱加入成功列表,失败则加入失败列表
  3. 每处理完一个邮箱就将两个列表写入本地文件(比如txt、excel),避免程序中断后状态丢失
    示例代码片段:
sent = []
failed = []

for email in emails:
    try:
        server.sendmail(SenderAddress, email, body)
        sent.append(email)
        # 每发成功一封就写入本地记录
        with open("sent_emails.txt", "a") as f:
            f.write(email + "\n")
        # 增加发送间隔,避免触发限流
        import time
        time.sleep(3)
    except Exception as e:
        failed.append(email)
        with open("failed_emails.txt", "a") as f:
            f.write(email + "\n")
        # 捕获到连接断开错误直接跳出循环,避免无效请求
        if isinstance(e, smtplib.SMTPServerDisconnected):
            break

后续重发直接读取failed_emails.txt的地址列表发送即可。

报错和邮件列表数量的关联

两者是间接关联,不存在直接的因果关系:

  • 104封的数量远低于Gmail免费账号单日500封的发送配额,本身不会直接触发报错
  • 报错的核心触发条件是发送速率超过Gmail限制,邮件数量越多,连续发送时触发限流的概率就越高,所以数量是提升报错概率的间接因素。如果给每封邮件设置3-5秒的发送间隔,即使是几百封的列表也不会触发该类报错。

内容的提问来源于stack exchange,提问作者Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:09:03