CS50 IDE中Flask Web应用无法发送邮件问题求助
解决CS50 IDE中Flask集成邮件发送的Errno 99问题
我来帮你搞定这个问题!你遇到的OSError: [Errno 99] Cannot assign requested address错误,主要是CS50 IDE的云端网络环境限制,加上Web应用里用input()获取密码的方式不适用,再配合Gmail的安全设置需要调整导致的。下面一步步来解决:
1. 先搞定Gmail的安全认证(关键!)
别直接降低账户安全级别,这太不安全了。改用App Password才是正确的姿势:
- 首先给你的Gmail账户开启两步验证(必须开,不然没法生成App Password)
- 登录Google账号的安全设置页面,找到「App Passwords」选项
- 选择应用类型为「Mail」,设备随便选个「Other」(比如命名为CS50 IDE),生成一个16位的App Password,把这个密码存好,后面要用
2. 调整Flask里的代码逻辑
Web应用不能像单独跑脚本那样用input()让用户输密码,得用环境变量来存储敏感信息:
- 在CS50 IDE的终端里输入:
export GMAIL_APP_PASSWORD="你刚才生成的16位App Password"(注意引号) - 然后修改你的邮件发送代码,用
os.getenv()读取这个环境变量,同时换用更兼容的SMTP连接方式(587端口+STARTTLS,比465的SSL更适配CS50的网络)
修改后的示例代码:
import os import smtplib from email.message import EmailMessage import ssl from flask import Flask app = Flask(__name__) def send_email(): port = 587 # 使用STARTTLS的端口 smtp_server = "smtp.gmail.com" sender_email = "sdrtempsamsung@gmail.com" receiver_email = "sdrtempsamsung@gmail.com" # 从环境变量读取App Password password = os.getenv("GMAIL_APP_PASSWORD") # 用EmailMessage构建邮件,比纯字符串更规范 message = EmailMessage() message["Subject"] = "Hi there" message["From"] = sender_email message["To"] = receiver_email message.set_content("This message is sent from Flask in CS50 IDE!") context = ssl.create_default_context() try: with smtplib.SMTP(smtp_server, port) as server: server.ehlo() # 可选,但有助于服务器识别 server.starttls(context=context) # 启用加密 server.ehlo() server.login(sender_email, password) server.send_message(message) print("邮件发送成功!") except Exception as e: print(f"发送失败:{str(e)}") # 定义一个Flask路由来触发邮件发送 @app.route("/send-test-email") def trigger_email(): send_email() return "邮件发送请求已提交,请查看收件箱!" if __name__ == "__main__": app.run(debug=True)
3. 为什么这样改能解决问题?
- Errno 99的原因:CS50 IDE的云端环境对直接使用465端口的SSL连接有网络限制,换成587端口+STARTTLS的方式更容易建立连接
- 密码处理:Web应用运行时没有终端交互,用环境变量存密码既安全又符合Web应用的运行逻辑
- App Password:避开了Gmail对低安全级别的限制,同时比直接用账户密码更安全
现在你可以在CS50 IDE里运行这个Flask应用,访问/send-test-email路由,应该就能成功发送邮件啦!
内容的提问来源于stack exchange,提问作者xxsdr
相关产品推荐
相关产品推荐

