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

如何用Python smtplib给DataFrame每行对应收件人发送一对一邮件

问题解决方法

报错原因

你遇到的AttributeError: 'list' object has no attribute 'encode'报错,是因为MIMEMultipart对象的To字段只接受单个邮箱字符串,或是多个邮箱用逗号拼接的字符串;你之前应该是直接传入了整个邮箱列的列表/Series对象,才触发了编码错误。

修改方案

核心调整点

  1. 遍历行时取当前行的单个邮箱值,不要取整个列
  2. 把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:06:00