Python实现DataFrame嵌入邮件正文为表格而非附件的问题
解决DataFrame嵌入邮件正文而非附件的问题
问题分析
你当前代码的核心问题是没有将开头的文本内容与DataFrame生成的HTML表格整合到同一个邮件正文中,加上部分邮件客户端对纯HTML结构的解析偏差,导致表格被误识别为附件。
修正方案
以下是调整后的代码,既解决表格嵌入正文的问题,也可利用你导入的pretty_html_table库美化表格(可选):
from pretty_html_table import build_table from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import smtplib # 筛选需要发送的DataFrame列 mail_df = mail_df[['IDNo','Value1','Value2','Value3']] # 构造邮件开头文本 body_text = '''Dear Employee, Please find the below details. Please confirm these entries and incase of any changes needed, Log in to - abcd.com. ''' # 生成带样式的表格HTML(不需要美化的话,替换为mail_df.to_html(index=False)) table_html = build_table(mail_df, 'blue_light') # 整合文本与表格为完整HTML结构 html_content = f""" <html> <head></head> <body> <p>{body_text}</p> {table_html} </body> </html> """ # 邮件基础配置 host = "host.name.com" TO = "pqr@gmail.com" msg = MIMEMultipart('alternative') # 指定类型提升客户端兼容性 msg['Subject'] = "Mail Subject" msg['From'] = 'xyz@gmail.com' msg['To'] = TO # 添加HTML格式的正文 part_html = MIMEText(html_content, 'html') msg.attach(part_html) # 发送邮件(需登录的话添加server.login(用户名, 密码)) with smtplib.SMTP(host) as server: server.starttls() server.send_message(msg)
关键调整点
- 将开头文本与表格HTML整合到同一个
<body>标签内,确保正文内容完整 - 使用
MIMEMultipart('alternative')替代默认类型,适配不同邮件客户端的解析规则 - 借助
pretty_html_table生成美观表格,也可直接用原生to_html方法生成基础表格 - 用
with语句管理SMTP连接,自动关闭连接更安全
内容的提问来源于stack exchange,提问作者FarzadAvari
相关产品推荐
相关产品推荐

