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

如何用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()

请求指导:

  1. 如何在邮件中使用上述列值;
  2. 邮件发送后如何将邮箱填入“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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 16:42:33