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

运行一次Python SMTP邮件代码却重复发送两封邮件的问题求助

问题原因及解决方案

核心问题1:脚本代码被执行两次

你的脚本主执行逻辑(调用send_template_email的部分)没有包裹在if __name__ == "__main__":块中。当PackageLoader("send_template_email", "templates")加载同名模块时,整个脚本代码会被再次执行,导致邮件发送两次。

核心问题2:全局EmailMessage对象存在风险

全局定义的msg = EmailMessage()会被多次复用,可能导致邮件头部或内容残留,引发不可预期的问题。


修改后的代码

from jinja2 import Environment, PackageLoader, select_autoescape
import smtplib
from email.message import EmailMessage

content = "hello"

def send_template_email(template, to, subj, **kwargs):
    env = Environment(
        loader=PackageLoader("send_template_email", "templates"),
        autoescape=select_autoescape(["html", "xml"])
    )
    template = env.get_template(template)  # 改为使用传入的template参数,避免硬编码
    send_email(to, subj, template.render(**kwargs))

def send_email(to, subj, body):
    # 每次发送邮件时创建新的EmailMessage对象
    msg = EmailMessage()
    server = smtplib.SMTP('smtp.gmail.com:587')
    server.starttls()
    server.login('sender_address@gmail.com','password')
    msg['Subject'] = subj
    msg['From'] = "sender_address@gmail.com"
    msg['To'] = to
    msg.set_content(body, subtype="html")
    server.send_message(msg)
    server.quit()

# 主逻辑包裹在__main__块中,避免模块导入时重复执行
if __name__ == "__main__":
    send_template_email(
        template="email_template.html",
        to="recipient@email.com",
        subj="TEST",
        content=content
    )

额外说明

  • 把env.get_template("email_template.html")改为env.get_template(template),让函数能真正使用传入的模板参数,符合函数设计意图。
  • 每次发送邮件时创建新的EmailMessage对象,彻底避免全局对象的状态污染问题。

内容的提问来源于stack exchange,提问作者tv_dinner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 20:57:16