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

Python发送邮件遇idna编码失败的UnicodeError,如何解决?

解决Python smtplib发送邮件时的UnicodeError: label empty or too long问题

看起来你遇到的这个错误其实和Gmail的SMTP服务器本身无关,而是Python在尝试获取本地主机名的时候出了问题——socket.getfqdn()调用失败,因为你的电脑主机名包含了不符合IDNA编码规范的字符,或者是空/长度超标了。

先看一下错误堆栈里的核心问题:

UnicodeError: encoding with 'idna' codec failed (UnicodeError: label empty or too long)

这个错误是smtplib.SMTP初始化时自动调用socket.getfqdn()触发的,而非连接SMTP服务器的环节。

下面给你两个可行的解决方案:

方案一:修改本地电脑的主机名(彻底解决)

Windows系统操作步骤:

  • 右键「此电脑」→ 选择「属性」
  • 点击「更改设置」(在「计算机名称、域和工作组设置」板块下方)
  • 在弹出的「系统属性」窗口中,切换到「计算机名」标签页,点击「更改」按钮
  • 设置一个符合IDNA规范的主机名:仅包含英文字母、数字和连字符(-),单段长度不超过63个字符,比如my-dev-pc
  • 保存设置后重启电脑,再运行代码

方案二:手动指定SMTP的本地主机名(快速临时解决)

不需要修改系统设置,直接在创建SMTP对象时手动传入local_hostname参数,绕过自动获取主机名的逻辑:

import smtplib

email_user = 'email@gmail.com'
email_send = 'email@gmail.com'
# 手动指定local_hostname为localhost,或者你的合法主机名
server = smtplib.SMTP('smtp.gmail.com', 587, local_hostname='localhost')
server.starttls()
# 注意:如果Gmail开启了两步验证,需要用应用专用密码替代原密码
server.login(email_user, 'your-password-or-app-password')
message = 'Hello'
server.sendmail(email_user, email_send, message)
server.quit()

另外补充两个Gmail的关键注意事项:

  • 如果你的账号开启了两步验证(2FA),直接用原密码登录会失败,需要去Google账号设置里生成应用专用密码来替代原密码
  • 如果没开2FA,需要在Google账号的「安全性」设置里开启「不太安全的应用访问」(不过Google现在默认关闭该选项,更推荐使用应用密码)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:49:31