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

Python基于CSV批量发送邮件出现SMTPServerDisconnected错误如何解决

错误原因
  • 核心原因是SMTP连接的作用域错误:你将SMTP服务的连接逻辑放在独立的with代码块中,with块执行完毕后会自动关闭SMTP连接并释放资源,后续读取CSV文件调用server.sendmail()时,连接已经处于断开状态,因此触发该报错。
  • 代码还存在几个隐藏问题会导致后续运行失败:
    1. 未导入csv模块,运行到csv.reader()时会触发NameError
    2. 存在多余的server.connect()调用:初始化smtplib.SMTP(smtp_server, port)时已经自动完成服务器连接,重复调用可能引发连接异常
    3. print(f'Sent to {name}')缩进错误:当前缩进层级在for循环外,仅会在所有邮件发送完成后打印最后一个收件人信息,无法逐次提示发送结果
    4. 你提供的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:06:04