From fd506775c15f9eddb7ce98d9fc12b460e1624c97 Mon Sep 17 00:00:00 2001 From: yueli Date: Fri, 17 Jul 2026 14:27:39 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20send=5Femail=5Fasync=20=E4=B8=BB?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E9=A2=84=E5=8F=96=20config=20=E4=BC=A0?= =?UTF-8?q?=E5=85=A5=20daemon=20=E7=BA=BF=E7=A8=8B=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=BC=82=E6=AD=A5=E9=82=AE=E4=BB=B6=E5=9B=A0=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=20Flask=20context=20=E5=AF=BC=E8=87=B4=20MAIL=5FENABL?= =?UTF-8?q?ED=3Dfalse?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inventory-backend/app/utils/email_service.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/inventory-backend/app/utils/email_service.py b/inventory-backend/app/utils/email_service.py index a5b8c0d..0f20839 100644 --- a/inventory-backend/app/utils/email_service.py +++ b/inventory-backend/app/utils/email_service.py @@ -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()