使用Python+Gmail批量发邮件出现SMTPServerDisconnected错误问题咨询
报错产生原因
- Gmail SMTP服务的限流策略触发:Gmail对第三方客户端发送邮件的速率有严格限制,短时间内连续发送大量邮件会被判定为垃圾邮件行为,服务器主动断开连接。你当前代码没有设置发送间隔,循环连续发送104封很容易触发该限制。
- 认证方式不兼容:当前Gmail早已不支持直接用账号原始密码进行SMTP登录,必须先开启账号的两步验证,再生成专属应用密码用于SMTP登录,否则也会出现连接被强制断开的问题。
- 环境版本问题:你使用的是Python 2.7版本,该版本早已停止维护,内置的
smtplib库存在连接保持的已知问题,也可能引发连接异常断开。
区分已发送/未发送邮箱的实现方式
在发送循环中增加异常捕获和状态持久化逻辑即可,修改思路如下:
- 初始化两个空列表分别存储发送成功、失败的邮箱地址
- 给
server.sendmail包裹try-except块,执行成功就将当前邮箱加入成功列表,失败则加入失败列表 - 每处理完一个邮箱就将两个列表写入本地文件(比如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
相关产品推荐
相关产品推荐

