最近在学习使用smtplib模块的时候遇到一个问题,在Windows环境下每次实例化smtplib.SMTP() 对象的时候总会报错,错误信息为“UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 4: invalid start byte”,而在Linux环境下就不会遇到这个问题。
示例代码演示
import smtplib
smtpObj = smtplib.SMTP()
在实例化时,会报以下错误
File "c:\Users\17626\.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\ptvsd_launcher.py", line 43, in
main(ptvsdArgs)
File "c:\Users\17626\.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 432, in main
run()
File "c:\Users\17626\.vscode\extensions\ms-python.python-2019.11.50794\pythonFiles\lib\python\old_ptvsd\ptvsd\__main__.py", line 316, in run_file
runpy.run_path(target, run_name='__main__')
File "C:\Program Files\Python37\lib\runpy.py", line 263, in run_path
pkg_name=pkg_name, script_name=fname)
File "C:\Program Files\Python37\lib\runpy.py", line 96, in _run_module_code
mod_name, mod_spec, pkg_name, script_name)
File "C:\Program Files\Python37\lib\runpy.py", line 85, in _run_code
exec(code, run_globals)
File "f:\workfiles\Python基础教程\发送Email\send_email.py", line 23, in
smtpObj = smtplib.SMTP()
File "C:\Program Files\Python37\lib\smtplib.py", line 261, in __init__
fqdn = socket.getfqdn()
File "C:\Program Files\Python37\lib\socket.py", line 676, in getfqdn
hostname, aliases, ipaddrs = gethostbyaddr(name)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb5 in position 4: invalid start byte
分析错误信息,发现C:\Program Files\Python37\lib\socket.py 文件的676行会获取一个"name",这是计算机名吗?
File "C:\Program Files\Python37\lib\socket.py", line 676, in getfqdn
hostname, aliases, ipaddrs = gethostbyaddr(name)
打开 C:\Program Files\Python37\lib\socket.py 这个文件,定位到676行,发现”name“获取的是本地计算机名,而我的Windows计算机的计算机名包含中文,应该是获取计算机名造成编码的问题。
定位到问题很就很好解决了, 在socket.py的第676行把”name“这个参数改成ascii编码,也就是在name后面加上 .encode(‘ascii’,‘ignore’) ,修改后的代码如下
hostname, aliases, ipaddrs = gethostbyaddr(name.encode("ascii","ignore"))
大功告成!!