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

Flask-Mail报KeyError错误:环境变量未配置致邮件服务启动失败

Flask-Mail配置出现KeyError的问题解决

问题背景

创建可发送确认邮件的Flask服务器时遇到KeyError,已通过终端安装Flask和Flask-Mail。

报错代码

import os
import re

from flask import Flask, render_template,request,redirect
from flask_mail import Mail, Message
from cs50 import SQL

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
# tcp port
app.config["MAIL_SERVER"] = "smtp.gmail.com"
app.config["MAIL_USE_TLS"] = True
# use encryption= true
app.config["MAIL_USERNAME"] = os.environ["MAIL_USERNAME"]

mail = Mail(app)
...

错误信息

Traceback (most recent call last):
  File "/opt/cs50/lib/flask", line 19, in <module>
    sys.exit(flask.cli.main())
  File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 1047, in main
    cli.main()
  File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1055, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1657, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.10/site-packages/click/core.py", line 1404, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.10/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/click/decorators.py", line 84, in new_func
    return ctx.invoke(f, obj, *args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/click/core.py", line 760, in invoke
    return __callback(*args, **kwargs)
  File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 911, in run_command
    raise e from None
  File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 897, in run_command
    app = info.load_app()
  File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 312, in load_app
froshims5/ $     app = locate_app(import_name, None, raise_if_not_found=False)
  File "/usr/local/lib/python3.10/site-packages/flask/cli.py", line 218, in locate_app
    __import__(module_name)
  File "/workspaces/103199450/froshims5/app.py", line 10, in <module>
    app.config["MAIL_DEFAULT_SENDER"] = os.environ["MAIL_DEFAULT_SENDER"]
  File "/usr/local/lib/python3.10/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'MAIL_DEFAULT_SENDER'

问题原因

代码中尝试通过os.environ["KEY"]读取环境变量,但MAIL_DEFAULT_SENDER(以及后续的MAIL_PASSWORD、MAIL_USERNAME)未在系统环境中设置,导致Python找不到对应键值,抛出KeyError。

解决方法

1. 直接在终端设置环境变量

根据你的操作系统执行对应命令(替换为你的实际邮箱信息):

  • Linux/macOS终端:
    export MAIL_DEFAULT_SENDER="your-email@gmail.com"
    export MAIL_USERNAME="your-email@gmail.com"
    export MAIL_PASSWORD="your-app-password"
    
  • Windows CMD:
    set MAIL_DEFAULT_SENDER=your-email@gmail.com
    set MAIL_USERNAME=your-email@gmail.com
    set MAIL_PASSWORD=your-app-password
    
  • Windows PowerShell:
    $env:MAIL_DEFAULT_SENDER="your-email@gmail.com"
    $env:MAIL_USERNAME="your-email@gmail.com"
    $env:MAIL_PASSWORD="your-app-password"
    

注意:如果使用Gmail且开启了两步验证,必须使用应用专用密码,不能用普通登录密码。

2. 使用.env文件管理环境变量(推荐)

这种方式更便于项目维护,避免每次启动都手动设置:

  • 安装依赖:
    pip install python-dotenv
    
  • 在项目根目录创建.env文件,写入:
    MAIL_DEFAULT_SENDER=your-email@gmail.com
    MAIL_USERNAME=your-email@gmail.com
    MAIL_PASSWORD=your-app-password
    
  • 在代码开头添加加载逻辑:
    from dotenv import load_dotenv
    load_dotenv()  # 加载.env中的环境变量
    

3. 临时硬编码(仅本地测试用,禁止生产环境)

如果只是快速测试,可以直接把值写在代码里:

app.config["MAIL_DEFAULT_SENDER"] = "your-email@gmail.com"
app.config["MAIL_PASSWORD"] = "your-app-password"
app.config["MAIL_USERNAME"] = "your-email@gmail.com"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:01:01