如何用smtplib发送带pandas DataFrame生成CSV附件且保留HTML视图的邮件
解决方案:邮件正文嵌入HTML表格+添加CSV附件
你的问题在于用add_alternative添加CSV是错误的——这个方法是用来为同一邮件内容提供不同格式的备选版本(比如纯文本和HTML),而非添加独立附件。正确的做法是使用EmailMessage.add_attachment()方法来添加CSV附件,同时保留原有的HTML正文设置。
修正后的完整代码
import smtplib import pandas as pd from email.message import EmailMessage # 邮件配置 SMTP_SERVER = 'smtp_server@example.com' FROM = 'some_address@example.com' TO = ['address@example.com'] SUBJECT = 'test attachment e-mail' EMAIL_TEMPLATE = """\ <html> <head> <style> table, th, td {{font-size:9pt; border:1px solid black; border-collapse:collapse; text-align:left; background-color:LightGray;}} th, td {{padding: 5px;}} </style> </head> <body> Dear Team,<br><br> Please Find the Project-wise Report with their respective Owners ID and e-mail address.!<br><br> {} <br><br> Kind regards.<br> STR TEAM. </body> </html>""" # 读取DataFrame(修正原代码错误:pd.DataFrame()不能直接传文件路径,需用pd.read_csv) df = pd.read_csv("/tmp/fix.txt") def send_email(): server = smtplib.SMTP(SMTP_SERVER) msg = EmailMessage() msg['Subject'], msg['From'], msg['To'] = SUBJECT, FROM, TO # 设置纯文本备选内容 msg.set_content("Text version of your html template") # 添加HTML正文 msg.add_alternative( EMAIL_TEMPLATE.format(df.to_html(index=False)), subtype='html' ) # 添加CSV附件 csv_content = df.to_csv(index=False) msg.add_attachment( csv_content, maintype='text', subtype='csv', filename='project_report.csv' # 附件显示的文件名 ) server.send_message(msg) server.quit() # 关闭SMTP连接 if __name__ == '__main__': send_email()
关键说明
- 修正DataFrame创建:原代码
pd.DataFrame("/tmp/fix.txt")不符合语法,需用pd.read_csv()读取文本文件生成DataFrame。 - 附件添加逻辑:
- 先用
df.to_csv(index=False)生成CSV格式字符串 - 通过
add_attachment()指定内容、MIME类型(text/csv)和附件文件名,实现独立附件添加
- 先用
- HTML视图保留:原有的
add_alternative设置HTML正文的逻辑完全保留,不会影响邮件的HTML显示效果。
内容的提问来源于stack exchange,提问作者user2023
相关产品推荐
相关产品推荐

