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

Python发送Outlook邮件时如何保留HTML表格原有格式

Outlook发送HTML表格样式丢失、错乱修复方案

核心原因

Outlook桌面端自2007版本起就调用Word内核渲染邮件内容,不支持外部样式表、<head>内的全局<style>块、CSS类选择器,仅识别直接写在标签style属性内的内联样式。你之前读取的data.html如果把灰色表头、边框等样式写在全局样式块或类选择器里,发送时会被Outlook直接过滤,最终出现格式错乱。


可直接落地的操作步骤

1. 放弃全局样式写法,所有样式直接内联到标签上

不要依赖pandas默认to_html()生成的带class的HTML输出,所有表格样式(灰色表头、边框、内边距、字体)全部直接写到对应HTML标签的style属性中,不要单独定义样式规则。
参考生成代码:

import pandas as pd

# 替换成你自己的DataFrame数据
df = pd.DataFrame({
    "统计项": ["指标1", "指标2", "指标3"],
    "数值": [120, 235, 178],
    "同比": ["+12%", "-3%", "+8%"]
})

# 表格骨架,所有样式直接内联
table_html = """
<table style="border-collapse: collapse; width: 100%; font-family: 微软雅黑, sans-serif; font-size: 12px;">
  <thead>
    <tr style="background-color: #f0f0f0;">
      {th_content}
    </tr>
  </thead>
  <tbody>
    {td_content}
  </tbody>
</table>
"""

# 拼接表头
th_cells = ""
for col in df.columns:
    th_cells += f'<th style="border: 1px solid #cccccc; padding: 8px; text-align: left; font-weight: bold;">{col}</th>'

# 拼接表体
tr_rows = ""
for _, row in df.iterrows():
    td_cells = ""
    for val in row:
        td_cells += f'<td style="border: 1px solid #cccccc; padding: 8px; text-align: left;">{val}</td>'
    tr_rows += f"<tr>{td_cells}</tr>"

# 得到最终可直接发送的表格HTML
final_html = table_html.format(th_content=th_cells, td_content=tr_rows)

2. 发送邮件时指定正确的内容格式

用Python发信时必须将MIME内容类型设为html,不能按纯文本格式发送,代码片段参考:

from email.mime.text import MIMEText

# 第二个参数固定填html,编码用utf-8避免乱码
msg = MIMEText(final_html, "html", "utf-8")
# 后续补充发件人、收件人、邮件主题、SMTP发信逻辑即可

避坑清单

  • 不要用div、section等HTML5标签做表格布局,Outlook对这类标签兼容性极差,表格结构全用<table>、<tr>、<th>、<td>实现
  • 样式单位全部用px,不要用em、rem等相对单位,颜色用十六进制色值,不要用CSS变量、rgb()/rgba()写法
  • 不要给表格加复杂的浮动、定位样式,Outlook基本不支持这类排版属性
  • 如果你之前的data.html是把样式写在全局<style>块里的,不需要再读取文件发送,直接按上述方法生成全内联样式的表格代码即可,发送后效果和预期完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:45:18