Python发送列表数据至邮件遇问题:仅显示最后一条数据
Python邮件发送列表数据仅显示最后一条的解决办法
问题场景
尝试通过Python将两个列表中的对应数据逐行发送到邮件,但最终只收到最后一条数据。
原代码
import smtplib from email.message import EmailMessage tokens = ['stfen1','stfen2','stfen3','stfen4','stfen5'] ids = ['idfstfen1','idfstfen1','idfstfen1','idfstfen1','idfstfen1',] num = 1 EMAIL_ADDRESS = ('example@gmail.com') EMAIL_PASSWORD = ('password') msg = EmailMessage() msg['Subject'] = f'EMP Data' msg['From'] = f'Name <{EMAIL_ADDRESS}>' msg['To'] = f'Name <{EMAIL_ADDRESS}>' for token,id in zip(tokens,ids): msg.set_content(f'Data\n{num}: Account ID->{id}--Account Token->{token}\n') num += 1 with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp: smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD) smtp.send_message(msg)
期望邮件输出
Data 1: Account ID-> idfstfen1--Account Token-> stfen1 Data 2: Account ID-> idfstfen1--Account Token-> stfen2 Data 3: Account ID-> idfstfen1--Account Token-> stfen3 Data 4: Account ID-> idfstfen1--Account Token-> stfen4 Data 5: Account ID-> idfstfen1--Account Token-> stfen5
实际邮件输出
Data 5: Account ID-> idfstfen1--Account Token-> stfen5
问题原因
msg.set_content()方法每次调用都会完全覆盖邮件的原有内容,循环中每次迭代都替换了邮件内容,最终仅保留最后一次循环设置的内容。
修正方案
先将所有需要展示的内容拼接成一个完整的字符串,再一次性设置为邮件内容。同时建议将变量id改为id_,避免与Python内置关键字冲突。
修正后的代码
import smtplib from email.message import EmailMessage tokens = ['stfen1','stfen2','stfen3','stfen4','stfen5'] ids = ['idfstfen1','idfstfen1','idfstfen1','idfstfen1','idfstfen1',] EMAIL_ADDRESS = ('example@gmail.com') EMAIL_PASSWORD = ('password') msg = EmailMessage() msg['Subject'] = f'EMP Data' msg['From'] = f'Name <{EMAIL_ADDRESS}>' msg['To'] = f'Name <{EMAIL_ADDRESS}>' # 先构建完整的邮件内容 email_content = "" for num, (token, id_) in enumerate(zip(tokens, ids), start=1): email_content += f'Data\n{num}: Account ID-> {id_}--Account Token-> {token}\n\n' # 一次性设置邮件内容 msg.set_content(email_content) with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp: smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD) smtp.send_message(msg)
验证结果
修正后发送的邮件会完整展示所有5条数据,与期望输出一致。
内容的提问来源于stack exchange,提问作者Zen35X
相关产品推荐
相关产品推荐

