Google政策变更后Django用Gmail发邮件遇WinError 10061问题求助
错误原因及解决方案
错误原因
出现ConnectionRefusedError的核心原因:
- Google在2022年5月取消了“不太安全的应用”选项,你的Django项目仍在尝试用旧认证方式连接Gmail SMTP服务器,被服务器主动拒绝。
- 代码里
send_mail的参数存在问题:第三个参数是发件人邮箱,你传入了用户提交的email,但Gmail SMTP不允许用非授权账号作为发件人,这会加剧连接失败概率。 - 可能你的
settings.py里的邮件SMTP配置不正确(比如端口、TLS设置错误)。
针对Gmail的正确配置方法
要继续用Gmail发送邮件,必须满足以下条件:
- 你的Gmail账号已开启两步验证(这是使用App Password的前提)。
- 生成专用的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-v5settings.py配置:
用法和Django原生EMAIL_BACKEND = "sendgrid_backend.SendgridBackend" SENDGRID_API_KEY = "你的SendGrid API密钥" SENDGRID_SANDBOX_MODE_IN_DEBUG = False # 开发环境可设为True,仅控制台输出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
相关产品推荐
相关产品推荐

