如何用Python smtplib给DataFrame每行对应收件人发送一对一邮件
问题解决方法
报错原因
你遇到的AttributeError: 'list' object has no attribute 'encode'报错,是因为MIMEMultipart对象的To字段只接受单个邮箱字符串,或是多个邮箱用逗号拼接的字符串;你之前应该是直接传入了整个邮箱列的列表/Series对象,才触发了编码错误。
修改方案
核心调整点
- 遍历行时取当前行的单个邮箱值,不要取整个列
- 把SMTP连接、登录逻辑移到循环外,避免重复创建连接浪费资源
完整可运行代码
import smtplib import pandas as pd from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 固定配置统一放在循环外 MY_ADDRESS = "mymail@mail.com" MY_PASSWORD = "mypassword" HOST_ADDRESS = 'smtp-mail.outlook.com' HOST_PORT = 587 # 只建立一次SMTP连接 server = smtplib.SMTP(host=HOST_ADDRESS, port=HOST_PORT) server.starttls() server.login(MY_ADDRESS, MY_PASSWORD) # 遍历DataFrame每一行 for idx, row in df.iterrows(): # 生成当前行专属邮件内容 z = row['first column'] + " hello " + row['second column'] # 取当前行对应的收件人邮箱,替换为你实际的邮箱列名即可 RECIPIENT_ADDRESS = row['你的邮箱列名'] # 单条邮件构造逻辑 message = MIMEMultipart() message['From'] = MY_ADDRESS # 如果单条需要发多个收件人,用以下写法拼接: # RECIPIENT_ADDRESS = ', '.join(row['你的多邮箱列表列名']) message['To'] = RECIPIENT_ADDRESS message['Subject'] = "Alerts" textPart = MIMEText(z) message.attach(textPart) # 发送当前邮件 server.send_message(message) # 所有邮件发送完成后关闭连接 server.quit()
注意事项
- 若某行数据需要发送给多个收件人,只需将该行存储的邮箱列表用
,拼接为字符串后再传入message['To']即可 - 发送过程中如果遇到发件服务器限流,可以在循环末尾加
time.sleep(几秒)调整发送频率
内容的提问来源于stack exchange,提问作者tatankadrums
相关产品推荐
相关产品推荐

