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

Django SMTP发信报getaddrinfo()类型错误 控制台发信正常

错误根因

报错是settings.py中SMTP配置项末尾多余的逗号导致的。Python语法中,单行赋值末尾加逗号会把变量值转为元组类型,你当前配置里的EMAIL_HOST实际读取到的值是('smtp.gmail.com',)而非预期的字符串,SMTP后端建立网络连接时,会把这个元组作为主机地址参数传给socket.getaddrinfo(),该函数要求第一个参数必须是字符串或None,因此抛出类型错误。
Console邮件后端不需要实际发起SMTP网络连接,只把邮件内容打印到控制台,所以不会触发这个报错。

修复步骤
  • 修正settings.py中的SMTP配置,删除配置项末尾多余的逗号,修改后配置如下:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'clients.red@gmail.com'
EMAIL_HOST_PASSWORD = 'password1'
EMAIL_PORT = 587
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
  • 删除注册视图中冗余的测试代码,这两行是临时调试用的,没有实际业务作用,留着反而可能触发额外报错:
# 删除以下两行
import socket
socket.getaddrinfo('localhost', 25)
额外需要修复的潜在问题

你贴的代码里还有几处会导致后续功能异常的问题,建议一并修正:

  • Django 3.2已经移除了django.utils.six模块,令牌生成代码的导入会报错,直接使用Python内置的str替代six.text_type即可,修正后令牌代码:
from django.contrib.auth.tokens import PasswordResetTokenGenerator

class TokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            str(user.pk) + str(timestamp) + str(user.is_active)
        )
account_activation_token = TokenGenerator()
  • 注册表单的fields配置写错了字段名,UserCreationForm的确认密码字段名为password2,不是password,否则表单校验会找不到字段报错,修正后表单配置:
class Meta:
    model = User
    fields = ('username', 'email', 'password1', 'password2')
  • 当前Gmail SMTP已经不支持使用账号普通密码登录,你需要先开启Google账号的两步验证,再生成应用专用密码填到EMAIL_HOST_PASSWORD位置,否则配置修正后会报SMTP认证错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:15:44