首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建smtp()时出现Python smtplib错误:'utf-8‘编解码器无法解码字节

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

Stack Overflow用户
提问于 2021-11-03 17:24:46
回答 1查看 96关注 0票数 0

我不能用gmail.com和mail.ru(bk.ru)以任何方式解决发送电子邮件的问题:当创建SMTP时,即使是空的,也会出现这个错误。我使用PyCharm 2020.1

代码语言:javascript
运行
复制
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()                                       # Выходим

如果我替换掉

代码语言:javascript
运行
复制
server = smtplib.SMTP_SSL('smtp.mail.ru', 465)

使用

代码语言:javascript
运行
复制
server = smtplib.SMTP_SSL() 
server.connect('smtp.mail.ru', 465)

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

代码语言:javascript
运行
复制
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本身的某个地方--这让我很困惑

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-03 21:39:53

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

代码语言:javascript
运行
复制
...
    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

代码语言:javascript
运行
复制
server = smtplib.SMTP_SSL('smtp.mail.ru', 465, 'your.host.name')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69829196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档