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

Django项目中调用send_mail无法发送邮件问题求助

邮件无法发送的排查与修复方案

1. 缺失Django邮件核心配置

send_mail 依赖项目 settings.py 中的邮件服务配置,未正确配置的话邮件根本无法发出。需在配置文件中添加并完善以下内容:

# settings.py 示例配置(根据你的邮箱服务商调整)
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.example.com'  # 如 smtp.gmail.com、smtp.qq.com
EMAIL_PORT = 587  # 对应服务商端口,常见587/465
EMAIL_USE_TLS = True  # 多数服务商要求开启TLS加密
EMAIL_HOST_USER = 'your-real-sender-email@example.com'  # 真实发件人邮箱
EMAIL_HOST_PASSWORD = 'your-email-password-or-app-code'  # 邮箱密码/应用专用密码

如果使用默认的 console 后端(django.core.mail.backends.console.EmailBackend),邮件只会打印到控制台,不会实际发送。

2. 无效的邮箱地址

代码中发件人 'from@'、收件人 ['to@'] 都是格式非法的无效地址:

  • 邮件服务器会直接拒收格式不合法的发件人
  • 无效收件人会导致邮件无法送达,部分场景下错误信息未在控制台输出

必须替换为真实有效的邮箱,例如:

send_mail(
    'Report server',
    response_msg,
    'your-sender@example.com',
    ['your-recipient@example.com'],
    fail_silently=False,
)

3. 代码逻辑错误

死循环无间隔执行

while True 循环中,sleep(float(timer)*3600) 被放在循环外部,导致程序进入无限死循环,持续高频发送请求和调用 send_mail,可能触发邮件服务商的频率限制,或阻塞请求线程导致邮件无法正常处理。需把 sleep 移到循环内部:

while True:
    response = requests.get(indirizzoIP)
    # 原判断逻辑错误:requests.get返回Response对象,永远不等于空字符串
    if response.status_code == 200:  # 正确判断服务器正常的方式是检查状态码
        response_msg = "Server OK"
        send_mail(
            'Report server',
            response_msg,
            'your-sender@example.com',
            ['your-recipient@example.com'],
            fail_silently=False,
        )   
        print(response_msg)
    sleep(float(timer)*3600)  # 移至循环内,按设定间隔执行

请求状态判断错误

原代码中 if response != "" 的判断逻辑完全错误,requests.get 返回的是 Response 对象,不是字符串,这个判断永远为真——哪怕服务器返回404/500错误,也会执行 send_mail,这不符合业务逻辑,需改为检查响应状态码(如 200 表示请求成功)。

4. 邮件服务商限制

即使配置正确,部分服务商(如Gmail)需要开启「应用专用密码」或允许「不太安全的应用访问」,否则会拒绝SMTP请求;频繁发送邮件也可能触发反垃圾机制,导致邮件被拦截或无法发送。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:25:14