如何跳过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
相关产品推荐
相关产品推荐

