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

Django应用发送邮件遇IOError:密码重置邮件无法发送

问题分析与解决方案

咱们先把问题拆成两部分来看:日志里的SIGPIPE错误,以及密码重置邮件没发送的核心原因。

一、关于SIGPIPE错误的解释

你看到的SIGPIPE: writing to a closed pipe/socket/fd错误,其实和邮件发送没关系。它的意思是:当用户提交密码重置表单后,可能提前关闭了浏览器或者刷新了页面,导致uWSGI服务器还在准备向客户端(用户浏览器)返回响应的时候,连接已经被断开了。uWSGI尝试往一个已经关闭的连接写数据,就触发了这个“断管”错误。

这个错误只是一个客户端行为导致的小异常,不会影响后台的邮件发送逻辑,所以不用把它当成邮件没收到的原因。

二、密码重置邮件无法发送的排查方向

真正的问题出在Django和SMTP服务器的交互上,结合你的配置,我给你列几个优先级从高到低的排查步骤:

1. 用Django Shell手动测试邮件发送

这是最直接的方法,能快速定位具体错误。登录到你的服务器,进入Django项目的虚拟环境,然后运行:

python manage.py shell

在shell里执行以下代码(把邮箱地址换成你的实际地址):

from django.core.mail import send_mail
send_mail(
    '测试邮件',
    '这是一封测试邮件,用来排查发送问题',
    'support@mydomain.com',
    ['admin@mydomain.com'],
    fail_silently=False,
)

如果fail_silently=False,代码会直接抛出异常,告诉你具体的错误——比如认证失败(密码错了)、连接超时(端口被防火墙挡了)、SMTP服务器拒绝连接(IP被拉黑)等等,这是最快找到问题的方式。

2. 验证SMTP服务器的连接性

在服务器上直接测试能不能连接到你的SMTP服务器,用openssl命令(比telnet更适合TLS连接):

openssl s_client -connect smtp.privateemail.com:587 -starttls smtp

如果连接成功,你会看到SMTP服务器的响应信息;如果连接失败,会提示超时、证书错误或者连接被拒绝,这说明要么是服务器防火墙挡住了587端口,要么是SMTP服务器的地址/端口配置错了。

3. 检查邮箱配置的正确性

  • 确认EMAIL_HOST_PASSWORD的密码是否正确:如果密码里有特殊字符(比如'、"、\),在Python的local_settings.py里需要正确处理——比如用双引号包裹密码,或者对特殊字符转义。
  • 确认EMAIL_USE_TLS = True和EMAIL_PORT = 587是否匹配:privateemail.com的587端口确实是用TLS加密的,这个配置没问题,但如果是用465端口的话,需要改成EMAIL_USE_SSL = True。

4. 检查服务器的防火墙/安全组

很多云服务器(比如AWS、阿里云、腾讯云)默认会限制出站的SMTP端口(25、587、465),需要手动在安全组里添加出站规则,允许访问smtp.privateemail.com的587端口,或者直接允许所有出站的587端口流量。

5. 检查邮箱服务商的限制

  • 确认你的support@mydomain.com邮箱是否开启了SMTP服务:有些邮箱默认关闭SMTP,需要在后台手动开启。
  • 确认是否需要使用应用专用密码:如果你的邮箱开启了两步验证,普通密码可能无法用于SMTP登录,需要生成一个应用专用密码填到EMAIL_HOST_PASSWORD里。
  • 检查邮箱的发件限制:比如privateemail.com有没有限制你的服务器IP,或者你的邮箱有没有因为发送过多邮件被标记为垃圾邮件发送者,导致邮件被拦截。

6. 开启Django的邮件日志

如果上面的方法都没找到问题,可以在settings.py里添加日志配置,捕获SMTP交互的详细信息:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'class': 'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.core.mail': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
    },
}

然后重新启动uWSGI,再次提交密码重置表单,查看uwsgi.log里的邮件相关日志,就能看到Django和SMTP服务器的每一步交互,找到具体的失败点。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:26:57