如何用Python的smtplib实现HTML报告的邮件附加/嵌入?
嘿,我来帮你搞定把Jupyter生成的HTML报告用smtplib发送的问题~ 你已经能成功发邮件了,那咱们直接解决嵌入HTML到邮件正文和附加HTML文件这两种需求:
一、把HTML报告嵌入邮件正文
这种方式能让收件人打开邮件直接看到报告内容,不用下载附件。步骤很简单:
- 完整读取你的HTML报告文件内容
- 创建HTML类型的MIMEText对象,把读取到的内容传进去
- 把这个MIMEText对象附加到你的MIMEMultipart邮件里
给你补全后的完整代码示例:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 配置邮件基本信息 fromaddr = "myemail@domain.com.au" toaddr = "myfriendsemail@domain.com.au" msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = "Automatic Weekly Report" # 读取HTML报告内容 with open("WeeklyReport.html", "r", encoding='utf-8') as f: html_content = f.read() # 创建HTML格式的邮件正文部分 html_part = MIMEText(html_content, 'html', 'utf-8') msg.attach(html_part) # 发送邮件(根据你的邮箱调整SMTP服务器信息) try: server = smtplib.SMTP('smtp.yourdomain.com', 587) # 比如Gmail用smtp.gmail.com,端口587 server.starttls() server.login(fromaddr, "your_email_password") # Gmail用户建议用两步验证后的App密码 text = msg.as_string() server.sendmail(fromaddr, toaddr, text) server.quit() print("邮件发送成功!") except Exception as e: print(f"发送失败:{str(e)}")
二、把HTML报告作为附件发送
如果希望收件人能下载保存报告,就用附件的方式:
- 读取HTML文件的二进制内容
- 创建MIMEBase对象处理附件
- 设置附件的类型和头信息,编码后附加到邮件里
对应的代码示例:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders # 配置邮件基本信息 fromaddr = "myemail@domain.com.au" toaddr = "myfriendsemail@domain.com.au" msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = "Automatic Weekly Report" # 可选:添加一段普通文本的正文说明 body = "这是本周的报告,请查收附件。" msg.attach(MIMEText(body, 'plain', 'utf-8')) # 处理HTML附件 filename = "WeeklyReport.html" with open(filename, "rb") as attachment: # 创建MIMEBase对象 part = MIMEBase('application', 'octet-stream') part.set_payload(attachment.read()) # 编码附件内容 encoders.encode_base64(part) # 设置附件的头信息 part.add_header('Content-Disposition', f'attachment; filename= {filename}') # 把附件附加到邮件 msg.attach(part) # 发送邮件(和上面的发送逻辑一致) try: server = smtplib.SMTP('smtp.yourdomain.com', 587) server.starttls() server.login(fromaddr, "your_email_password") text = msg.as_string() server.sendmail(fromaddr, toaddr, text) server.quit() print("邮件发送成功!") except Exception as e: print(f"发送失败:{str(e)}")
小提醒:
- 记得把
smtp.yourdomain.com换成你邮箱对应的SMTP服务器,比如网易邮箱用smtp.163.com,Outlook用smtp.office365.com - 读取HTML文件时指定正确编码(比如utf-8),避免出现乱码问题
内容的提问来源于stack exchange,提问作者Stuart Robertson
相关产品推荐
相关产品推荐

