Python批量发送个性化学费账单邮件异常:所有家长收相同内容的修复
问题分析与修复方案
你遇到的问题核心在于邮件对象(msg)被重复复用,没有为每个家长创建独立的邮件实例。
问题根源
你的msg = MIMEMultipart()是在for循环外面初始化的,每次循环你只是修改msg['To']并调用msg.attach()添加新正文,但之前添加的正文内容并没有被清除。这会导致:
- 后续的邮件会叠加所有之前学生的账单内容(虽然你看到打印的内容是对的,但实际邮件对象里已经累积了所有历史正文)
- 部分邮件客户端可能只会显示最早添加的正文内容,也就是第一个学生的信息,这就导致所有家长都收到了学生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()
关键修改点说明
- 独立邮件实例:将
msg = MIMEMultipart()放入循环内,每次迭代都会创建一个全新的邮件对象,完全隔离不同家长的邮件内容。 - 避免内容叠加:每个邮件只attach当前学生的账单正文,不会累积之前的内容。
- 代码优化:用f-string替代字符串拼接,让正文格式化更清晰直观。
这样修改后,每位家长就会收到对应自己孩子的个性化学费账单了。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

