fix: send_email_async 主线程预取 config 传入 daemon 线程,修复异步邮件因丢失 Flask context 导致 MAIL_ENABLED=false

This commit is contained in:
yueli
2026-07-17 14:27:39 +08:00
parent 5b57895b99
commit fd506775c1

View File

@ -45,7 +45,7 @@ def _get_config():
}
def send_email(to_email: Union[str, List[str]], subject: str, content: str):
def send_email(to_email: Union[str, List[str]], subject: str, content: str, cfg: dict = None):
"""
通用邮件发送函数
@ -53,10 +53,12 @@ def send_email(to_email: Union[str, List[str]], subject: str, content: str):
to_email: 收件人,单个邮箱字符串或列表
subject: 邮件主题
content: 邮件正文(纯文本)
cfg: 可选,预先获取的配置字典(用于异步线程传参,避免丢失 Flask context
发送失败时打印日志,不抛出异常
"""
cfg = _get_config()
if cfg is None:
cfg = _get_config()
print(f"[DEBUG send_email] cfg = {cfg}")
@ -123,12 +125,15 @@ def send_email_async(to_email: Union[str, List[str]], subject: str, content: str
异步发送邮件(守护线程,不阻塞主请求线程)。
用法:直接替代 send_email() 调用,接口完全相同。
线程内不依赖 Flask context仅用 os.getenv + smtplib无需 app.app_context()。
在主线程中预取配置,传入守护线程,避免线程内丢失 Flask context 导致
_get_config() 回退到 os.getenv() 而 docker-compose 未设置 MAIL_* 环境变量。
"""
import threading
cfg = _get_config()
t = threading.Thread(
target=send_email,
args=(to_email, subject, content),
kwargs={'cfg': cfg},
daemon=True
)
t.start()