Flask-Mail出现KeyError: MAIL_DEFAULT_SENDER错误求助
Flask-Mail项目触发KeyError: 'MAIL_DEFAULT_SENDER'错误排查
运行CS50课程的Flask-Mail项目时触发KeyError: 'MAIL_DEFAULT_SENDER'错误,已多次重装依赖、确认Python解释器正确性,问题仍未解决。以下是项目代码、报错信息及解决思路:
项目代码
import re import os from flask import Flask, request, render_template, current_app from flask_mail import Mail, Message app = Flask(__name__) app.config['MAIL_DEFAULT_SENDER'] = os.environ['MAIL_DEFAULT_SENDER'] app.config["MAIL_PASSWORD"] = os.environ["MAIL_PASSWORD"] app.config["MAIL_PORT"] = 587 app.config["MAIL_SERVER"] = "smtp.gmail.com" app.config["MAIL_USE_TLS"] = True app.config["MAIL_USERNAME"] = os.environ["MAIL_USERNAME"] mail = Mail(app) SPORTS = [ "Basketball", "Soccer", "Ultimate Frisbee" ] @app.route("/") def index(): return render_template("index.html", sports=SPORTS) @app.route("/register", methods=["POST"]) def register(): name = request.form.get("name") email = request.form.get("email") sport = request.form.get("sport") if not name or not email or sport not in SPORTS: return render_template("failure.html") message = Message("You are registered!", recipients=[email]) mail.send(email) return render_template("success.html")
报错信息
$ python -m flask run Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "C:\Python311\Lib\site-packages\flask\__main__.py", line 3, in <module> main() File "C:\Python311\Lib\site-packages\flask\cli.py", line 1047, in main cli.main() File "C:\Python311\Lib\site-packages\click\core.py", line 1055, in main rv = self.invoke(ctx) ^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\click\core.py", line 1657, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\click\core.py", line 1404, in invoke return ctx.invoke(self.callback, **ctx.params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\click\core.py", line 760, in invoke return __callback(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\click\decorators.py", line 84, in new_func return ctx.invoke(f, obj, *args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\click\core.py", line 760, in invoke return __callback(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\flask\cli.py", line 911, in run_command raise e from None File "C:\Python311\Lib\site-packages\flask\cli.py", line 897, in run_command app = info.load_app() ^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\flask\cli.py", line 308, in load_app app = locate_app(import_name, name) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Python311\Lib\site-packages\flask\cli.py", line 218, in locate_app __import__(module_name) File "C:\*my_folders*\*my_folders*\froshimsemail\app.py", line 8, in <module> app.config['MAIL_DEFAULT_SENDER'] = os.environ['MAIL_DEFAULT_SENDER'] ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^ File "<frozen os>", line 678, in __getitem__ KeyError: 'MAIL_DEFAULT_SENDER'
错误原因
KeyError: 'MAIL_DEFAULT_SENDER'表示Python尝试读取系统环境变量MAIL_DEFAULT_SENDER,但该变量未被定义。代码中os.environ['MAIL_DEFAULT_SENDER']是直接通过键名获取环境变量,若变量不存在则会抛出此错误。同理,MAIL_PASSWORD、MAIL_USERNAME也存在同样的潜在问题。
解决方法
方法1:临时设置环境变量(Windows)
在启动项目的命令行中先执行以下命令,设置所需环境变量:
set MAIL_DEFAULT_SENDER=你的邮箱地址 set MAIL_PASSWORD=你的邮箱授权码(Gmail需使用应用专用密码) set MAIL_USERNAME=你的邮箱地址
设置完成后再运行python -m flask run
方法2:使用.env文件管理环境变量(推荐)
- 安装
python-dotenv依赖:pip install python-dotenv - 在项目根目录创建
.env文件,写入以下内容:MAIL_DEFAULT_SENDER=你的邮箱地址 MAIL_PASSWORD=你的邮箱授权码 MAIL_USERNAME=你的邮箱地址 - 在
app.py开头添加加载.env文件的代码:from dotenv import load_dotenv load_dotenv() # 加载.env中的环境变量
之后启动项目时,Python会自动读取.env中的变量,无需每次手动设置。
方法3:代码容错处理(不推荐)
若只是临时测试,可使用os.environ.get()方法设置默认值,但不建议硬编码敏感信息(如密码):
app.config['MAIL_DEFAULT_SENDER'] = os.environ.get('MAIL_DEFAULT_SENDER', '默认邮箱地址')
额外代码修正
注意代码中mail.send(email)存在错误,send()方法需要传入Message对象而非字符串邮箱地址,应改为:
mail.send(message)
内容的提问来源于stack exchange,提问作者Mr. Darkness
相关产品推荐
相关产品推荐

