Python基于CSV批量发送邮件出现SMTPServerDisconnected错误如何解决
错误原因
- 核心原因是SMTP连接的作用域错误:你将SMTP服务的连接逻辑放在独立的
with代码块中,with块执行完毕后会自动关闭SMTP连接并释放资源,后续读取CSV文件调用server.sendmail()时,连接已经处于断开状态,因此触发该报错。 - 代码还存在几个隐藏问题会导致后续运行失败:
- 未导入
csv模块,运行到csv.reader()时会触发NameError - 存在多余的
server.connect()调用:初始化smtplib.SMTP(smtp_server, port)时已经自动完成服务器连接,重复调用可能引发连接异常 print(f'Sent to {name}')缩进错误:当前缩进层级在for循环外,仅会在所有邮件发送完成后打印最后一个收件人信息,无法逐次提示发送结果- 你提供的CSV示例中第二个收件人邮箱为
another#gmail.com,属于格式错误,#应为@,实际使用时需检查修正
- 未导入
修复方案
将CSV读取、邮件发送的逻辑全部移动到SMTP连接的with代码块内部,同时修正上述隐藏问题即可。
如果登录时报身份验证错误,需要确认你的谷歌账号开启了两步验证,生成应用专用密码后代替普通账号密码使用。
修复后的完整代码
import smtplib, ssl import csv # 补全csv模块导入 port = 587 # For starttls smtp_server = "smtp.gmail.com" login = "joo123456h@gmail.com" password = input("Type your password and press enter:") message = """Subject: Order confirmation To: {recipient} From: {sender} Hi {name}, thanks for your order! We are processing it now and will contact you soon""" sender = "new@example.com" context = ssl.create_default_context() with smtplib.SMTP(smtp_server, port) as server: server.ehlo() # Can be omitted server.starttls(context=context) server.ehlo() # Can be omitted server.login(login, password) # 读取CSV、发送邮件的逻辑移动到with块内部,保证连接处于活跃状态 with open("contacts.csv") as file: reader = csv.reader(file) next(reader) # 跳过表头 for name, email in reader: server.sendmail( sender, email, message.format(name=name, recipient=email, sender=sender) ) print(f'Sent to {name}') # 调整缩进放到for循环内
内容的提问来源于stack exchange,提问作者hii
相关产品推荐
相关产品推荐

