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

Python使用smtplib创建SMTP对象时报'utf-8'解码错误如何解决

问题根因

你遇到的报错并非邮件业务代码或SMTP服务端配置错误导致,问题出在Windows系统环境:
smtplib初始化SMTP对象时会默认调用socket.getfqdn()获取本地主机的全限定域名,如果你的Windows主机名包含非UTF-8编码的特殊字符(比如俄文、中文、带特殊符号的非ASCII字符),Python3的socket库在Windows平台解码主机名时就会触发该Unicode解码错误。

解决方案

提供两种可直接落地的解决方式,优先选第一种无需修改系统配置:

方案1:手动指定local_hostname参数跳过本地主机名获取(推荐)

SMTP/SMTP_SSL的构造函数支持传入local_hostname参数,手动传入合法ASCII字符串即可跳过自动获取主机名的逻辑,直接修改创建SMTP对象的代码即可:

# 直接初始化的写法
server = smtplib.SMTP_SSL('smtp.mail.ru', 465, local_hostname='localhost')

如果是分步创建的写法,也要在创建实例时传入该参数:

server = smtplib.SMTP_SSL(local_hostname='localhost') 
server.connect('smtp.mail.ru', 465)

这里传入的localhost可替换为任意纯英文数字组成的字符串,不影响邮件发送逻辑。

方案2:修改系统主机名(根治)

将Windows系统的主机名修改为仅包含英文、数字和横杠的纯ASCII格式,修改后重启电脑生效,后续所有调用socket获取主机名的场景都不会再触发该类解码错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:24:03