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

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文件管理环境变量(推荐)

  1. 安装python-dotenv依赖:
    pip install python-dotenv
    
  2. 在项目根目录创建.env文件,写入以下内容:
    MAIL_DEFAULT_SENDER=你的邮箱地址
    MAIL_PASSWORD=你的邮箱授权码
    MAIL_USERNAME=你的邮箱地址
    
  3. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:35:22