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

如何用Python win32生成带重复HTML块的Outlook邮件模板?

问题

工作中需要制作基础Outlook邮件模板,运行脚本时输入数字X,生成包含X个重复物料信息块的仓库物料放行邮件。目前已实现用mail.Save()保存草稿,但无法在HTMLBody中生成X个包含名称、追踪号/工单、物料号、批次、容器数的重复内容块。考虑移除原始的r""""""原始字符串格式,改用字符串拼接并调用类来生成重复块,想确认这个方案是否适配需求。

现有代码:

import win32com.client as win32
import os

outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)

# 收件人
mail.To = 'Email here'

# 邮件主题
mail.Subject = 'Subject here'

# 邮件正文
mail.HTMLBody = r"""
    The following stuff is ready: <br><br>

    <b>Name</b><br>          // 需要重复X次的内容块开始
    Tracking #/ WO #: <br>
    Item #: <br>
    Lot #: <br>
    X containers <br><br>    // 需要重复X次的内容块结束

    Best regards, <br><br>

    <p style="font-family: Arial; font-size: 10pt"><b>My Name</b><br>
    Title<br>
    Company<br>
    D: phone number here<br>
    fakeEmail@somedomain.com<br>
    www.fakesite.com<br></p>

"""

mail.Save()

尝试的写法:

mail.HTMLBody = (
"text here"
# 调用类生成重复块的代码
"text here to finish signature"
)
解决方案

这个思路完全适配需求,字符串拼接+类/函数生成重复块的方式,能灵活实现动态生成X个重复内容的需求,比固定的原始字符串模板更易维护和扩展。

下面是具体的实现示例:

  1. 先定义一个生成单个物料信息块的类(类的形式更适合复用和扩展物料属性):
class MaterialBlock:
    def __init__(self, name, tracking_no, item_no, lot_no, container_count):
        self.name = name
        self.tracking_no = tracking_no
        self.item_no = item_no
        self.lot_no = lot_no
        self.container_count = container_count

    def to_html(self):
        return f"""
        <b>{self.name}</b><br>
        Tracking #/ WO #: {self.tracking_no}<br>
        Item #: {self.item_no}<br>
        Lot #: {self.lot_no}<br>
        {self.container_count} containers<br><br>
        """
  1. 然后修改邮件正文的拼接逻辑,输入X并生成对应数量的物料块:
import win32com.client as win32

outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)

# 收件人
mail.To = 'Email here'
# 邮件主题
mail.Subject = 'Subject here'

# 输入需要生成的重复块数量X
X = int(input("请输入物料块数量:"))

# 生成X个物料块示例(实际使用时可替换为真实数据,比如从Excel/数据库读取)
material_blocks = []
for i in range(X):
    # 这里可改为从用户输入或数据源获取真实信息
    block = MaterialBlock(
        name=f"物料名称{i+1}",
        tracking_no=f"TRK-{i+1:03d}",
        item_no=f"ITEM-{i+1:03d}",
        lot_no=f"LOT-{i+1:03d}",
        container_count=i+1
    )
    material_blocks.append(block.to_html())

# 拼接完整HTML正文
html_start = """
The following stuff is ready: <br><br>
"""
html_end = """
Best regards, <br><br>

<p style="font-family: Arial; font-size: 10pt"><b>My Name</b><br>
Title<br>
Company<br>
D: phone number here<br>
fakeEmail@somedomain.com<br>
www.fakesite.com<br></p>
"""

mail.HTMLBody = html_start + "".join(material_blocks) + html_end

mail.Save()

说明

  • 用类封装物料块的属性和HTML生成逻辑,后续如果需要修改物料块格式或新增属性,直接修改MaterialBlock类的to_html方法即可,维护性更强。
  • 字符串拼接的方式可以灵活组合固定内容和动态生成的重复块,完全满足输入X生成对应数量内容的需求。
  • 实际使用时,可将物料数据来源替换为Excel表格、数据库或用户批量输入,替代示例中的模拟数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:05:22