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

Google政策变更后Django用Gmail发邮件遇WinError 10061问题求助

错误原因及解决方案

错误原因

出现ConnectionRefusedError的核心原因:

  1. Google在2022年5月取消了“不太安全的应用”选项,你的Django项目仍在尝试用旧认证方式连接Gmail SMTP服务器,被服务器主动拒绝。
  2. 代码里send_mail的参数存在问题:第三个参数是发件人邮箱,你传入了用户提交的email,但Gmail SMTP不允许用非授权账号作为发件人,这会加剧连接失败概率。
  3. 可能你的settings.py里的邮件SMTP配置不正确(比如端口、TLS设置错误)。

针对Gmail的正确配置方法

要继续用Gmail发送邮件,必须满足以下条件:

  1. 你的Gmail账号已开启两步验证(这是使用App Password的前提)。
  2. 生成专用的App Password:
    • 登录Google账号安全设置,找到「App Passwords」(仅开启两步验证后可见)。
    • 选择「Mail」和对应设备(比如「Other (Custom name)」),生成一个16位的App Password。

在Django的settings.py中配置邮件:

# settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = '你的Gmail账号@gmail.com'
EMAIL_HOST_PASSWORD = '刚才生成的16位App Password'  # 注意不是Gmail登录密码

同时修正视图代码中的send_mail调用:

from django.conf import settings

def contact(request):
    if request.method == 'POST':
        try:
            # 用表单实例化并校验的方式更规范
            form = ContactForm(request.POST)
            if form.is_valid():
                form.save()
        except Exception as ve:
            print(f"保存表单出错:{ve}")
        finally:
            subject = f"联系表单提交:{request.POST.get('name')}"
            message = request.POST.get('message')
            send_mail(
                subject,
                message,
                settings.EMAIL_HOST_USER,  # 使用配置好的发件人邮箱
                ['sportold4@gmail.com'],
                fail_silently=False
            )
            return render(request, 'contact.html', {'page': 'contact'})
    return render(request, 'contact.html', {'page': 'contact'})

Django发送邮件的替代方法

如果不想依赖Gmail,这些方案更稳定:

1. 第三方邮件服务(推荐生产环境使用)

比如SendGrid、Mailgun、Postmark,提供高送达率,不受个人邮箱限制:

  • SendGrid:
    安装依赖:pip install django-sendgrid-v5
    settings.py配置:
    EMAIL_BACKEND = "sendgrid_backend.SendgridBackend"
    SENDGRID_API_KEY = "你的SendGrid API密钥"
    SENDGRID_SANDBOX_MODE_IN_DEBUG = False  # 开发环境可设为True,仅控制台输出
    
    用法和Django原生send_mail完全一致。

2. 使用Outlook/Hotmail SMTP

配置示例:

# settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.office365.com'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = '你的Outlook账号@outlook.com'
EMAIL_HOST_PASSWORD = '你的Outlook密码'

3. 开发环境用控制台输出

开发测试时,可直接在终端打印邮件内容,无需实际发送:

# settings.py
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:20:32