如何在Python用win32com发送的Outlook邮件中插入Pandas变量
在Outlook HTML邮件正文中插入Pandas/Numpy数据值的实现方法
嘿,这事儿其实超简单!咱们可以利用Python的字符串格式化能力,轻松把Pandas里的数据、计算结果或者已定义的变量嵌入到Outlook的HTML邮件正文中。下面给你分享几种实用的实现方式:
方法1:使用f-string格式化(Python 3.6+首选)
f-string是目前最直观、最便捷的字符串格式化方式,直接把变量或者Pandas的计算表达式用{}包裹,就能嵌入到HTML内容里。给你看个完整的示例代码:
import win32com.client as win32 import pandas as pd import numpy as np # 先构造一个示例DataFrame(替换成你的真实数据) df = pd.DataFrame({'Sales': [100, 200, 300, 400], 'Profit': [10, 25, 30, 45]}) variable1 = df['Sales'].max() # 提前赋值的变量 # 初始化Outlook邮件 outlook = win32.Dispatch('outlook.application') mail = outlook.CreateItem(0) mail.To = 'mail@domain.com' mail.Subject = '销售数据统计报告' # 用f-string把数据嵌入HTML正文 mail.HTMLBody = f""" <html> <body> <h2>📊 销售数据统计</h2> <p>本次统计共包含 <strong>{df.shape[0]}</strong> 条记录</p> <p>最高销售额为 <strong>{variable1}</strong> 元</p> <p>最高利润为 <strong>{df['Profit'].max()}</strong> 元</p> </body> </html> """ # 如需添加附件,取消下面两行注释 # attachment = "C:/path/to/your/report.xlsx" # mail.Attachments.Add(attachment) mail.Send()
这种方式的好处是代码可读性极强,一眼就能看出哪些位置会插入动态数据,而且Python会自动把数字、数值类型的计算结果转换成字符串,不用额外处理。
方法2:使用str.format()方法(兼容低版本Python)
如果你的Python版本低于3.6,或者更习惯这种格式化风格,可以用str.format()来实现:
# 替换邮件HTML正文部分即可 mail.HTMLBody = """ <html> <body> <h2>📊 销售数据统计</h2> <p>本次统计共包含 <strong>{row_count}</strong> 条记录</p> <p>最高销售额为 <strong>{max_sales}</strong> 元</p> <p>最高利润为 <strong>{max_profit}</strong> 元</p> </body> </html> """.format( row_count=df.shape[0], max_sales=variable1, max_profit=df['Profit'].max() )
这里需要把要插入的动态数据作为参数传给format()方法,对应HTML里的占位符名称,逻辑也很清晰。
方法3:字符串拼接(不推荐,但应急可用)
虽然这种方式代码会显得零散,维护起来麻烦,但如果应急的话也能使用:
# 拆分HTML片段,逐个拼接动态内容 html_head = "<html><body><h2>📊 销售数据统计</h2>" row_count_section = f"<p>本次统计共包含 <strong>{df.shape[0]}</strong> 条记录</p>" max_sales_section = f"<p>最高销售额为 <strong>{variable1}</strong> 元</p>" max_profit_section = f"<p>最高利润为 <strong>{df['Profit'].max()}</strong> 元</p>" html_foot = "</body></html>" # 拼接成完整的HTML正文 mail.HTMLBody = html_head + row_count_section + max_sales_section + max_profit_section + html_foot
小提示
如果你的数据是日期、百分比这类特殊格式,记得提前做格式化处理,比如用df['Date'].max().strftime('%Y-%m-%d')把日期转换成指定的字符串格式,这样邮件里的显示会更规范。
内容的提问来源于stack exchange,提问作者Abhinav Kumar




