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

Python批量发送个性化学费账单邮件异常:所有家长收相同内容的修复

问题分析与修复方案

你遇到的问题核心在于邮件对象(msg)被重复复用,没有为每个家长创建独立的邮件实例。

问题根源

你的msg = MIMEMultipart()是在for循环外面初始化的,每次循环你只是修改msg['To']并调用msg.attach()添加新正文,但之前添加的正文内容并没有被清除。这会导致:

  1. 后续的邮件会叠加所有之前学生的账单内容(虽然你看到打印的内容是对的,但实际邮件对象里已经累积了所有历史正文)
  2. 部分邮件客户端可能只会显示最早添加的正文内容,也就是第一个学生的信息,这就导致所有家长都收到了学生A的账单。

修复后的代码

把邮件对象的初始化移到for循环内部,确保每个家长都对应一个全新的邮件实例:

def send_mail(studentParentContact, studentTuition):
    # 提前建立SMTP连接,避免循环内重复连接服务器
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.starttls()
    s.login(username, PASSWORD)  # after-school program gmail login
    
    for student in studentParentContact:
        # 为每个家长创建独立的邮件对象
        msg = MIMEMultipart()
        msg['Subject'] = 'Your kid After-school Program Tuition Bill'
        msg['From'] = FLPEmail  # after-school program's email address
        
        ParentEmail = studentParentContact[student]
        tuition = studentTuition[student]
        msg['To'] = ParentEmail
        
        # 使用f-string格式化正文,更简洁易读
        body = f"Hi, \nThe tuition for {student} is ${tuition}"
        msg.attach(MIMEText(body, 'plain'))
        
        text = msg.as_string()
        print(FLPEmail, ParentEmail, text)
        s.sendmail(FLPEmail, ParentEmail, text)
    
    s.quit()

关键修改点说明

  1. 独立邮件实例:将msg = MIMEMultipart()放入循环内,每次迭代都会创建一个全新的邮件对象,完全隔离不同家长的邮件内容。
  2. 避免内容叠加:每个邮件只attach当前学生的账单正文,不会累积之前的内容。
  3. 代码优化:用f-string替代字符串拼接,让正文格式化更清晰直观。

这样修改后,每位家长就会收到对应自己孩子的个性化学费账单了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:31:03