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

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()

主要优化点说明

  1. 完全动态的HTML生成:

    • 不用再手动写死所有的<p>Expectativas xxx</p>和<img src="cid:imageX">,新增/删除子文件夹或图片,邮件内容会自动同步
    • 子文件夹的名称直接作为邮件里的章节标题,保持文件结构和邮件内容一致
  2. 代码结构更清晰:

    • 把邮箱、密码、文件夹路径等配置项集中到代码开头,后续修改不用到处找
    • 修复了你原代码里的HTML闭合错误(原代码最后写反了</body>和</html>的顺序)
  3. 额外的小改进:

    • 用os.path.join()拼接路径,避免手动拼接字符串的路径分隔符问题(跨平台更友好)
    • 增加了异常捕获,发送失败时会提示错误信息,方便排查问题
    • 给图片的alt属性加上了更有意义的描述,提升可访问性
  4. 保持核心逻辑不变:

    • 还是用Content-ID嵌入图片,确保图片直接显示在邮件正文里,不用附件打开

其他可选优化建议

  • 如果子文件夹里的图片需要按特定顺序排列,可以给图片文件名加上前缀(比如01_xxx.png、02_yyy.png),然后用sorted()对img_paths排序
  • 可以把HTML的样式(比如字体、间距)用CSS统一设置,让邮件排版更美观
  • 可以添加邮件抄送人、密送人,或者支持多个收件人

备注:内容来源于stack exchange,提问作者Ramiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 15:53:04