如何用Python循环提取CSV列值嵌入邮件并更新assigned to列
问题:如何在邮件中嵌入CSV列值并更新“assigned to”列?
需求说明:需将CSV文件中“id”和“desc”列的值发送至“Emails”列(即B列)对应的邮箱,且邮件发送后将收件邮箱填入“assigned to”列。
问题:已尝试使用for循环遍历邮箱列表发送邮件,但无法将“id”和“desc”值嵌入邮件正文,附上代码如下:
import pandas as pd import win32com.client e = pd.read_csv('combo.csv') emails = e['Emails'].values ticket_number = e['id'].values desc_value = e['desc'].values for i in emails, ticket_number, desc_value: outlook = win32com.client.Dispatch("Outlook.Application") message = 'Hello the ticket number {ticket_number} with the Description {desc_value} has been assigned to you.' mail = outlook.CreateItem(0) mail.To = i mail.Subject = 'This is a test' mail.HTMLBody = message mail.Send()请求指导:
- 如何在邮件中使用上述列值;
- 邮件发送后如何将邮箱填入“assigned to”列。
解决方案
我来帮你一步步解决这两个问题,先拆解你代码里的核心问题,再给出修正后的完整实现:
1. 嵌入CSV列值到邮件正文
你的代码有两个关键问题导致值无法正确嵌入:
- 循环遍历方式错误:
for i in emails, ticket_number, desc_value会把三个数组当成三个独立的迭代项,而不是每次取一组对应的邮箱、工单ID和描述。更直观的方式是直接遍历DataFrame的每一行,或者用zip()把三个序列打包。 - 字符串格式化未生效:你写的
{ticket_number}只是字符串的字面内容,没有关联到实际变量。用Python的f-string可以轻松完成变量嵌入,语法简洁又直观。
另外,没必要在循环里反复初始化Outlook客户端,放在循环外只执行一次就够了,能提升效率。
2. 更新“assigned to”列
发送邮件成功后,直接给DataFrame的对应行赋值即可,最后一定要把修改后的DataFrame保存回CSV文件,否则修改只会停留在内存中,不会持久化到本地。
修正后的完整代码
import pandas as pd import win32com.client # 读取CSV文件,用df更符合Pandas的命名习惯 df = pd.read_csv('combo.csv') # 初始化Outlook客户端(仅需执行一次) outlook = win32com.client.Dispatch("Outlook.Application") # 遍历DataFrame的每一行,idx是行索引,row是当前行的数据 for idx, row in df.iterrows(): # 从当前行提取所需值 recipient_email = row['Emails'] ticket_id = row['id'] ticket_desc = row['desc'] # 用f-string构建HTML格式的邮件正文,排版更美观 email_body = f""" <html> <body> <p>Hi there,</p> <p>A new ticket has been assigned to you:</p> <ul> <li>Ticket Number: <strong>{ticket_id}</strong></li> <li>Description: {ticket_desc}</li> </ul> <p>Please handle it at your earliest convenience.</p> </body> </html> """ # 创建邮件 mail_item = outlook.CreateItem(0) mail_item.To = recipient_email mail_item.Subject = f"New Ticket Assigned: {ticket_id}" mail_item.HTMLBody = email_body # 发送邮件——如果想先预览内容,注释掉下面一行,换成mail_item.Display() mail_item.Send() # 更新当前行的"assigned to"列 df.loc[idx, 'assigned to'] = recipient_email # 保存修改后的CSV文件,index=False表示不写入行索引 df.to_csv('combo.csv', index=False)
额外提示
- 测试阶段可以把
mail_item.Send()换成mail_item.Display(),这样会打开Outlook的邮件编辑窗口,方便你先检查内容再手动发送。 - 如果你的CSV原本没有“assigned to”列,Pandas会自动帮你新增这一列,无需额外处理。
- HTML格式的邮件正文比纯文本更易读,你可以根据需求调整HTML的排版和内容。
内容的提问来源于stack exchange,提问作者sunith kumar
相关产品推荐
相关产品推荐

