Ubuntu下Django发Hotmail邮件遇Invalid domain name错误求助
解决Django发送Hotmail邮件时的SMTPHeloError问题
问题根源
SMTPHeloError: (501, b'5.5.4 Invalid domain name') 错误的核心原因是:Outlook的SMTP服务器在接收HELO/EHLO握手请求时,判定你的Ubuntu主机提交的域名无效或无法解析。Outlook服务器会严格验证发送端的主机名合法性。
具体解决方案
1. 修正Django邮件配置的变量错误
你的配置里存在变量名错误,同时需要补充发件人地址配置:
# 修正变量名:EMAIL_HOST_USERNAME → EMAIL_HOST_USER EMAIL_HOST_USER = 'x@hotmail.com' # 添加发件人地址,需和邮箱账户一致 DEFAULT_FROM_EMAIL = 'x@hotmail.com' EMAIL_HOST = 'smtp-mail.outlook.com' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' # 别忘了补充邮箱密码配置 EMAIL_HOST_PASSWORD = 'your-hotmail-password'
2. 配置Ubuntu主机的合法主机名
Outlook服务器会校验发送端的系统主机名,你需要给Ubuntu设置一个符合规范的主机名:
- 临时生效(重启后失效):
sudo hostname your-valid-domain.com - 永久生效:
编辑/etc/hostname文件,替换为合法域名(或符合格式的名称):
输入sudo nano /etc/hostnameyour-valid-domain.com后保存退出,再编辑/etc/hosts添加映射:
新增一行:sudo nano /etc/hosts127.0.0.1 your-valid-domain.com
3. 自定义Django SMTP后端指定HELO主机名
如果不想修改系统主机名,可以通过自定义SMTP后端强制指定HELO时使用的合法域名:
在项目中创建utils/email_backends.py文件:
from django.core.mail.backends.smtp import EmailBackend import smtplib class CustomSMTPBackend(EmailBackend): def open(self): if self.connection: return False try: self.connection = smtplib.SMTP(self.host, self.port, timeout=self.timeout) # 手动指定HELO主机名,替换为合法域名 self.connection.ehlo('your-valid-domain.com') if self.use_tls: self.connection.starttls(context=self.ssl_context) self.connection.ehlo('your-valid-domain.com') if self.username and self.password: self.connection.login(self.username, self.password) return True except smtplib.SMTPException as e: if not self.fail_silently: raise return False
然后修改Django配置中的后端:
EMAIL_BACKEND = 'utils.email_backends.CustomSMTPBackend'
4. 检查Outlook账户安全设置
- 若开启了两步验证,需创建应用密码,用该密码替代原密码作为
EMAIL_HOST_PASSWORD - 未开启两步验证时,确保账户设置中“允许低安全性应用访问”选项已开启
内容的提问来源于stack exchange,提问作者Sky Q
相关产品推荐
相关产品推荐

