如何用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个重复内容的需求,比固定的原始字符串模板更易维护和扩展。
下面是具体的实现示例:
- 先定义一个生成单个物料信息块的类(类的形式更适合复用和扩展物料属性):
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> """
- 然后修改邮件正文的拼接逻辑,输入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
相关产品推荐
相关产品推荐

