fix: send_email_async 主线程预取 config 传入 daemon 线程,修复异步邮件因丢失 Flask context 导致 MAIL_ENABLED=false
This commit is contained in:
@ -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()
|
||||
|
||||
Reference in New Issue
Block a user