You need to enable JavaScript to run this app. Django send_mail发信报ConnectionRefusedError Errno61连接被拒
优惠活动
大模型
产品
解决方案
定价
更多

Django send_mail发信报ConnectionRefusedError Errno61连接被拒

报错根因定位

核心触发原因

  • 从错误堆栈可以看到,send_mail()的调用被直接写在了users/views.py的模块顶层,也就是Django启动时导入路由、加载views模块的启动阶段,就会强制执行发邮件逻辑,并非在请求触发的视图函数内部执行
  • Django在未读取到自定义SMTP配置时,会默认尝试连接本地127.0.0.1:25端口的SMTP服务,绝大多数开发环境本地根本没有运行对应端口的邮件服务,操作系统会直接拒绝连接请求,最终抛出ConnectionRefusedError: [Errno 61](macOS系统的典型连接拒绝报错)
分步解决方案

1. 修正代码执行位置

把写在模块顶层的send_mail()调用,移入具体的视图函数内部,避免在项目启动阶段就触发网络请求。正确写法示例:

from django.core.mail import send_mail
from django.http import HttpResponse

def test_send_email_view(request):
    # 仅当用户访问该视图对应的路由时,才会执行发邮件逻辑
    send_mail(
        '邮件主题',
        '邮件正文内容',
        '你的真实发件邮箱地址',
        ['你的真实收件邮箱地址'],
        fail_silently=False,
    )
    return HttpResponse("邮件发送流程已触发")

2. 在settings.py中补充完整SMTP配置

按照你使用的邮箱服务商要求,填入匹配的SMTP连接参数,避免Django使用默认的本地连接配置。通用配置模板:

# settings.py 内的邮件配置段
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = '对应邮箱服务商的SMTP服务器地址'
EMAIL_PORT = 服务商提供的SMTP端口(常见为465/587)
# 注意:根据端口选择加密方式,不要同时开启SSL和TLS
EMAIL_USE_SSL = True  # 使用465端口时开启
# EMAIL_USE_TLS = True  # 使用587端口时开启
EMAIL_HOST_USER = '完整的发件邮箱地址'
EMAIL_HOST_PASSWORD = '邮箱服务商提供的SMTP授权码(非邮箱登录密码)'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

3. 开发调试阶段的可选简化方案

如果仅需验证邮件逻辑流程是否通畅,不需要实际发送外部邮件,可临时将邮件后端切换为控制台输出模式,全程不触发网络连接,从根源避免连接类报错:

# settings.py 内的临时调试配置
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

配置生效后,所有待发送的邮件内容会直接打印在runserver的控制台日志中,可直接验证邮件主题、正文、收件人配置是否正确。

常见排查注意事项
  • 发件人地址必须和EMAIL_HOST_USER保持一致,否则多数邮箱服务商会直接拦截请求
  • SMTP授权码需要在邮箱服务商的设置页面单独开启获取,直接使用邮箱登录密码通常会触发认证失败
  • 排查本地防火墙、安全软件是否拦截了Django进程对外的SMTP端口连接请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 14:15:03