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
相关产品推荐
相关产品推荐

