运行一次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
相关产品推荐
相关产品推荐

