Python嵌入图表的HTML邮件发送代码优化求助
Python嵌入图表的HTML邮件发送代码优化求助
哇,作为第一次接触HTML就能写出能跑的嵌入图表邮件代码,已经超棒了!虽然代码能完成任务,但硬编码的HTML部分确实可以优化,让它更灵活,以后加新图表也不用手动改HTML啦~
核心优化思路:动态生成HTML内容
你现在的HTML是手动写死了所有标题和图片标签,其实可以利用你遍历文件夹的逻辑,把文件夹名称作为邮件里的章节标题,子文件夹里的图片自动生成对应的嵌入标签,完全不用硬编码每个imageX和段落。
优化后的完整代码示例
import os import glob import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage def enviar_email(): # -------------------------- 配置项:把固定参数提出来,方便修改 -------------------------- SUBJECT = 'Relatório Focus Out' SENDER_EMAIL = 'SEU_EMAIL@gmail.com' RECEIVER_EMAIL = 'DESTINATARIO_EMAIL@dominio.com' APP_PASSWORD = 'dcau ogjy pdct rqhl' # Gmail的应用专用密码 MAIN_DIR_PATH = r'K:\Temp\Ramiro\Relatório Focus out' # -------------------------- 动态生成HTML内容 -------------------------- # HTML头部模板 html_head = """ <html> <body> <p>Prezados,</p> """ # HTML内容主体(动态生成) html_body = "" # HTML尾部模板 html_foot = """ </body> </html> """ msg = MIMEMultipart() msg['Subject'] = SUBJECT msg['From'] = SENDER_EMAIL msg['To'] = RECEIVER_EMAIL index = 0 # 遍历子文件夹(每个子文件夹对应一个章节) sub_dirs = glob.glob(os.path.join(MAIN_DIR_PATH, '*')) for sub_dir in sub_dirs: # 用子文件夹的名称作为邮件里的章节标题 section_title = os.path.basename(sub_dir) html_body += f"\n <p><strong>{section_title}</strong></p>\n" html_body += " <p>\n" # 遍历当前子文件夹里的所有png图片 img_paths = glob.glob(os.path.join(sub_dir, '*.png')) # 如果需要按文件名排序,可添加:img_paths = sorted(img_paths) for img_path in img_paths: # 嵌入图片到邮件,并记录Content-ID with open(img_path, 'rb') as fp: img = MIMEImage(fp.read(), _subtype='png') cid = f'image{index}' img.add_header('Content-ID', f'<{cid}>') msg.attach(img) # 把当前图片的img标签加入HTML html_body += f" <img src=\"cid:{cid}\" alt=\"{section_title} - Imagem {index}\" width=\"600\" height=\"300\">\n" index += 1 html_body += " </p>\n" # 拼接完整的HTML内容 full_html = html_head + html_body + html_foot msg.attach(MIMEText(full_html, 'html', 'utf-8')) # -------------------------- 发送邮件 -------------------------- try: with smtplib.SMTP('smtp.gmail.com', 587) as smtp: smtp.starttls() smtp.login(SENDER_EMAIL, APP_PASSWORD) smtp.sendmail(SENDER_EMAIL, [RECEIVER_EMAIL], msg.as_string()) print('Email enviado com sucesso!') except Exception as e: print(f'Erro ao enviar email: {str(e)}') if __name__ == "__main__": enviar_email()
主要优化点说明
完全动态的HTML生成:
- 不用再手动写死所有的
<p>Expectativas xxx</p>和<img src="cid:imageX">,新增/删除子文件夹或图片,邮件内容会自动同步 - 子文件夹的名称直接作为邮件里的章节标题,保持文件结构和邮件内容一致
- 不用再手动写死所有的
代码结构更清晰:
- 把邮箱、密码、文件夹路径等配置项集中到代码开头,后续修改不用到处找
- 修复了你原代码里的HTML闭合错误(原代码最后写反了
</body>和</html>的顺序)
额外的小改进:
- 用
os.path.join()拼接路径,避免手动拼接字符串的路径分隔符问题(跨平台更友好) - 增加了异常捕获,发送失败时会提示错误信息,方便排查问题
- 给图片的
alt属性加上了更有意义的描述,提升可访问性
- 用
保持核心逻辑不变:
- 还是用
Content-ID嵌入图片,确保图片直接显示在邮件正文里,不用附件打开
- 还是用
其他可选优化建议
- 如果子文件夹里的图片需要按特定顺序排列,可以给图片文件名加上前缀(比如
01_xxx.png、02_yyy.png),然后用sorted()对img_paths排序 - 可以把HTML的样式(比如字体、间距)用CSS统一设置,让邮件排版更美观
- 可以添加邮件抄送人、密送人,或者支持多个收件人
备注:内容来源于stack exchange,提问作者Ramiro
相关产品推荐
相关产品推荐

