解决Python在使用smtplib时报错UnicodeDecodeError

最近在学习使用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"))

大功告成!!

上一篇
下一篇