创建 smtp() 时出现 Python smtplib 错误:“utf-8”编解码器无法解码字节

Posted

技术标签:

【中文标题】创建 smtp() 时出现 Python smtplib 错误:“utf-8”编解码器无法解码字节【英文标题】:Python smtplib error when creating smtp(): 'utf-8' codec can't decode byte 【发布时间】:2021-12-18 02:08:27 【问题描述】:

我无法解决使用 gmail.com 以任何方式发送电子邮件的问题,也无法使用 mail.ru(bk.ru):创建 SMTP 时,即使为空,也会发生此错误 我使用 PyCharm 2020.1

import requests
import smtplib                                      # Импортируем библиотеку по работе с SMTP

from email.mime.multipart import MIMEMultipart      # Многокомпонентный объект
from email.mime.text import MIMEText                # Текст/html
from email.mime.image import MIMEImage              # Изображения

addr_from = "zabrell@bk.ru"                 # Адресат
addr_to   = "zabrell@bk.ru"                   # Получатель
password  = "***"                                  # Пароль

msg = MIMEMultipart()                               # Создаем сообщение
msg['From']    = addr_from                          # Адресат
msg['To']      = addr_to                            # Получатель
msg['Subject'] = '1'                   # Тема сообщения
body = '1'
msg.attach(MIMEText(body, 'plain'))                 # Добавляем в сообщение текст

server = smtplib.SMTP_SSL('smtp.mail.ru', 465)      # Создаем объект SMTP
server.login(addr_from, password)                   # Получаем доступ
server.send_message(msg)                            # Отправляем сообщение
server.quit()                                       # Выходим

如果我替换

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

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

即使没有 _SSL(但它在服务器上没有连接),那么这个错误仍然出现在 smtplib.SMTP_SSL() 阶段

Traceback (most recent call last):
  File "C:/Users/zabre/PycharmProjects/miners_test/script.py", line 35, in <module>
    server = smtplib.SMTP_SSL('smtp.mail.ru', 465)      # Создаем объект SMTP
  File "C:\Users\zabre\AppData\Local\Programs\Python\Python38-32\lib\smtplib.py", line 1034, in __init__
    SMTP.__init__(self, host, port, local_hostname, timeout,
  File "C:\Users\zabre\AppData\Local\Programs\Python\Python38-32\lib\smtplib.py", line 263, in __init__
    fqdn = socket.getfqdn()
  File "C:\Users\zabre\AppData\Local\Programs\Python\Python38-32\lib\socket.py", line 756, in getfqdn
    hostname, aliases, ipaddrs = gethostbyaddr(name)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf7 in position 10: invalid start byte

Process finished with exit code 1

我理解错误的含义,但它看起来像是在 smtplib 内部的某个地方——这让我很困惑

【问题讨论】:

【参考方案1】:

库尝试使用socket.getfqdn() 找出本地主机名以发送到远程服务器:

...
    if local_hostname is not None:
        self.local_hostname = local_hostname
    else:
        # RFC 2821 says we should use the fqdn in the EHLO/HELO verb, and
        # if that can't be calculated, that we should use a domain literal
        # instead (essentially an encoded IP address like [A.B.C.D]).
        fqdn = socket.getfqdn()
        if '.' in fqdn:
            self.local_hostname = fqdn
...

所以问题是:您的主机名是什么?问题可能是它包含非 ascii 字符,无法解码为 UTF-8。

除了更改主机名之外,一种可能的解决方案是在构造函数中显式传递local_hostname

server = smtplib.SMTP_SSL('smtp.mail.ru', 465, 'your.host.name')

【讨论】:

兄弟,你是最棒的! server = smtplib.SMTP_SSL('smtp.mail.ru', 465, 'portable') - 工作!

以上是关于创建 smtp() 时出现 Python smtplib 错误:“utf-8”编解码器无法解码字节的主要内容,如果未能解决你的问题,请参考以下文章

SMTP 错误:尝试使用 python 和 postfix 发送电子邮件时出现“收件人地址被拒绝”

从 docker 连接到 office365 SMTP 时出现异常

提交时出现 SMTP 邮件服务器 (sendgrid) 错误

尝试通过 Office 365 发送电子邮件时出现 SMTP 5.7.57 错误

在 Windows XP 中使用 Indy 10 发送带有内嵌图像的电子邮件时出现“SMTP 传入数据超时”

从第三方 HTML 控件使用 Google SMTP 发送邮件时出现问题