Python变量未更新问题:批量邮件程序无法遍历CSV列表
批量邮件程序循环更新问题的解决办法
问题原因
你定义的name_cell、email_cell、邮件内容email_body、message这些变量都是在循环外面执行的,只读取了cell_value=0时的初始数据。循环里只递增了cell_value,但没有重新根据新的cell_value获取联系人信息,也没有重新构建邮件内容,所以每次发送的都是第一个人的邮件。
修复后的代码
把需要动态更新的部分放到循环内部,每次循环都重新获取当前联系人的信息、构建新的邮件:
#AutoMail Version 2 #Goal of new version is to run on any computer. With minimal or no mouse and keyboard input import pandas as pd import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 获取发件人信息 sender_address = str(input("Please enter your email address!: ")) sender_pass = str(input("Please enter your email password (No data is stored anywhere!): ")) # 读取CSV文件 file_path = "C:/Users/Spring/Documents/test_book_py.csv" #Change to input later!!!!!! df = pd.read_csv(file_path, usecols=['First Name', 'Email Address']) amount = int(input("How many emails would you like to send? ")) # 创建SMTP会话(只需要初始化一次) session = smtplib.SMTP('smtp.gmail.com', 587) session.starttls() session.login(sender_address, sender_pass) # 邮件发送循环 count = 0 while count < amount: # 每次循环都获取当前联系人的信息 name_cell = df["First Name"].values[count] email_cell = df["Email Address"].values[count] # 构建当前邮件的内容 receiver_address = email_cell email_subj = "This is a test subject" email_body = f"Hello {name_cell}, This is a test body" # 创建新的邮件对象 message = MIMEMultipart() message['From'] = sender_address message['To'] = receiver_address message['Subject'] = email_subj message.attach(MIMEText(email_body, 'plain')) text = message.as_string() # 发送邮件 session.sendmail(sender_address, receiver_address, text) count += 1 print(f"已发送 {count} 封邮件")
更简洁的优化方案(用pandas行遍历)
手动管理count和cell_value容易出错,直接遍历DataFrame的行更直观,还能避免超出列表索引的问题:
#AutoMail Version 2 #Goal of new version is to run on any computer. With minimal or no mouse and keyboard input import pandas as pd import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 获取发件人信息 sender_address = str(input("Please enter your email address!: ")) sender_pass = str(input("Please enter your email password (No data is stored anywhere!): ")) # 读取CSV文件 file_path = "C:/Users/Spring/Documents/test_book_py.csv" #Change to input later!!!!!! df = pd.read_csv(file_path, usecols=['First Name', 'Email Address']) amount = int(input("How many emails would you like to send? ")) # 创建SMTP会话 session = smtplib.SMTP('smtp.gmail.com', 587) session.starttls() session.login(sender_address, sender_pass) # 遍历前amount行数据 for idx, row in df.head(amount).iterrows(): name_cell = row['First Name'] email_cell = row['Email Address'] # 构建邮件 email_subj = "This is a test subject" email_body = f"Hello {name_cell}, This is a test body" message = MIMEMultipart() message['From'] = sender_address message['To'] = email_cell message['Subject'] = email_subj message.attach(MIMEText(email_body, 'plain')) # 发送 session.sendmail(sender_address, email_cell, message.as_string()) print(f"已发送给 {name_cell}") session.quit() # 关闭会话 print(f"全部发送完成,共发送 {amount} 封邮件")
关键注意点
- SMTP会话只需要初始化一次,不需要每次循环重建,提升效率
- 使用f-string格式化邮件内容比字符串拼接更简洁易读
- 发送完成后记得调用
session.quit()关闭SMTP连接,避免资源占用
内容的提问来源于stack exchange,提问作者gcb140
相关产品推荐
相关产品推荐

