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

Python用win32com调用Outlook发邮件:如何合并for循环输出到正文

解决for循环输出整合进单封Outlook邮件的实现方案

问题根源

  • Python 依靠缩进判定代码块归属,你当前实际运行的代码存在缩进偏差:创建Outlook实例、新建邮件、配置参数、执行发送的逻辑被错误放置在for循环的缩进范围内,导致每完成一次循环遍历就触发一次独立发件流程,生成多封单独的邮件。
  • 没有定义专门的变量在循环过程中累积输出内容,原代码中HTML正文模板写死固定文本,即使调整缩进也无法自动整合所有循环结果。

实现逻辑

  • 循环执行前提前定义空字符串变量,专门用来存储所有需要展示在邮件正文中的循环输出结果
  • 单独完成全部循环遍历流程:每轮遍历将生成的内容按格式拼接到提前定义的存储变量中,全程不触发任何邮件相关操作
  • 等所有循环执行完毕、正文内容完全拼接完成后,再统一执行Outlook实例创建、邮件项生成、收件人/主题配置、正文填充、发送的全流程,保证发件操作仅执行一次

可直接运行的修正代码

import win32com.client as client

# 提前初始化变量,累积所有循环生成的邮件正文内容
mail_content_container = ""

# 仅在循环中完成内容遍历与拼接,不涉及任何发件逻辑
j = range(1, 9)
for i in j:
    loop_result = i * 2  # 对应实际输出的2、4、6...16的数值
    print(loop_result)
    # 将每轮的结果按HTML格式拼接到总内容变量中
    mail_content_container += f"<p>{loop_result}</p>"

# 循环全部结束后,再执行唯一一次邮件创建与发送流程
outlook = client.Dispatch("Outlook.Application")
message = outlook.CreateItem(0)
message.Display()
message.To = "xxxxx"
message.CC = "xxxxx"
message.Subject = "test"
# 将拼接好的全部循环内容嵌入整体HTML模板
html_body = f"""
               <div>
                {mail_content_container}
                </div>
                """
message.HTMLBody = html_body
message.Send()
print("Mail Sent")

关键注意事项

  • 邮件创建、发送的相关代码必须放在for循环的缩进块外部,否则会重复触发多封邮件的创建与发送
  • message.Send()方法仅能在所有正文内容准备完成后调用一次,循环过程中调用会导致发件流程提前触发
  • HTML正文的动态内容需要通过字符串格式化的方式嵌入,不要直接在静态字符串中写固定变量名,否则正文无法展示循环生成的结果

内容的提问来源于stack exchange,提问作者Ishika

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 14:06:02