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

如何跳过smtplib.SMTPDataError,让邮件发送脚本继续执行?

解决Python发邮件时跳过无效邮箱的问题

直接把单封邮件的发送逻辑套在try-except里,塞到遍历邮箱的for循环内部就行。这样碰到SMTPDataError时,程序会直接跳过当前邮箱的成功操作,继续处理下一个。

给你整理好的代码示例:

import smtplib
from email.mime.text import MIMEText

# 先建立SMTP连接,放循环外面避免重复连接浪费资源
smtp_server = '你的SMTP服务器地址'
smtp_port = 587
sender_email = '你的发件邮箱'
sender_password = '你的邮箱密码/授权码'

# 先确保SMTP连接正常
try:
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()
    server.login(sender_email, sender_password)
except Exception as e:
    print(f"SMTP连接失败: {e}")
    exit()

# 客户邮箱列表
customer_emails = ['客户1@xxx.com', '无效邮箱格式@', '客户2@xxx.com']
success_count = 0

for email in customer_emails:
    try:
        # 构造邮件内容
        msg = MIMEText('圣诞快乐!这是咱们的新闻稿内容...', 'plain', 'utf-8')
        msg['From'] = sender_email
        msg['To'] = email
        msg['Subject'] = '圣诞快乐 - 最新新闻速递'

        # 发送邮件
        server.sendmail(sender_email, email, msg.as_string())
        
        # 只有发送成功才执行以下操作
        print(f"邮件已发送: {email}")
        success_count += 1

    except smtplib.SMTPDataError as e:
        # 专门捕获无效邮箱这类SMTP数据错误
        print(f"{email} 是无效邮箱,发送失败: {e}")
        continue  # 直接跳过当前邮箱,处理下一个
    except Exception as e:
        # 捕获其他意外错误,防止程序崩溃
        print(f"发送{email}时出现异常: {e}")
        continue

# 发送完成后关闭SMTP连接
server.quit()
print(f"全部发送完毕,成功发送{success_count}封邮件")

关键说明:

  • try块包裹了构造邮件、发送邮件、成功后的打印和计数逻辑,只要发送环节出错,后续的成功操作就不会执行。
  • 单独捕获smtplib.SMTPDataError对应你遇到的无效邮箱问题,同时保留通用Exception兜底,避免其他意外导致程序崩溃。
  • continue语句确保遇到错误时直接进入下一次循环,完全符合你跳过无效邮箱的需求。
  • SMTP连接放在循环外,避免每发送一封邮件就重新建立连接,提升发送效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:00:46