根本原因是Django默认同步连接SMTP且本地无邮件服务或端口未开放需确认EMAIL_BACKEND为smtp后端、使用应用专用密码、适配465/587端口并用线程实现异步发送。SMTP配置后邮件发不出去send_mail 卡住或报 ConnectionRefusedError根本原因通常是 Django 默认用同步方式连 SMTP 服务器而本地开发环境没装邮件服务或生产环境防火墙/端口没放开。别急着换库先确认连接通不通python -c import smtplib; s smtplib.SMTP(smtp.gmail.com, 587); s.starttls(); print(OK) —— 手动测通路绕过 DjangoDjango 的 EMAIL_BACKEND 必须设为 django.core.mail.backends.smtp.EmailBackend不是默认的 console 后端Gmail/Outlook 等需要开启「应用专用密码」或 OAuth2普通账号密码大概率被拒错误信息通常是 SMTPAuthenticationError阿里云、腾讯云 ECS 默认封 25 端口得改用 465SSL或 587TLS对应配置 EMAIL_USE_SSL 或 EMAIL_USE_TLS二者不能同时为 True想发邮件不阻塞视图响应但又不想引入 Celery直接用线程最轻量Django 自身不带异步邮件发送能力send_mail 是纯同步调用。硬上 async/await 没用 —— SMTP 库大多不支持 asyncio。用 threading.Thread 包一层最稳妥from threading import Threaddef send_async_mail(*args, **kwargs): Thread(targetsend_mail, argsargs, kwargskwargs).start()注意线程里不能依赖 request 对象或未序列化的上下文比如 model 实例得提前取好 str 或 dict 数据传进去别用 concurrent.futures.ThreadPoolExecutor 做简单通知——线程池适合复用单次发信反而增加调度开销如果并发量真高比如每秒几十封线程还是不如 Celery Redis但那是另一个量级的问题了send_mail 和 EmailMessage 该选哪个send_mail 只能发纯文本附件、HTML 内容、多收件人抄送都得换 EmailMessage。它不是“高级版”而是“必须用”的底层接口。send_mail 本质就是封装了 EmailMessage 的简单调用参数少适合密码重置这类单文本通知要嵌入图片、加附件、用模板渲染 HTML必须用 EmailMessagemsg EmailMessage( subject订单完成, bodyh1感谢下单/h1, from_emailnoreplyexample.com, to[userexample.com])msg.content_subtype htmlmsg.send()EmailMessage 的 to、cc、bcc 都是 list别传字符串否则发信失败但无提示模板里用 {% autoescape off %} 渲染 HTML 邮件时确保内容可信否则 XSS 风险直接进收件箱测试环境邮件全发到控制台但上线后收不到因为 EMAIL_BACKEND 在不同环境配错了。Django 不会自动切换靠你手动区分。 RedClaw 百度推出的手机端万能AI Agent助手