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
相关产品推荐
相关产品推荐

