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

