Ошибка Python smtplib при создании smtp (): кодек ‘utf-8’ не может декодировать байт

#python #smtplib

Вопрос:

Я никак не могу решить проблему отправки электронного письма с помощью 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 lt;modulegt;  server = smtplib.SMTP_SSL('smtp.mail.ru', 465) # Создаем объект SMTP  File "C:UserszabreAppDataLocalProgramsPythonPython38-32libsmtplib.py", line 1034, in __init__  SMTP.__init__(self, host, port, local_hostname, timeout,  File "C:UserszabreAppDataLocalProgramsPythonPython38-32libsmtplib.py", line 263, in __init__  fqdn = socket.getfqdn()  File "C:UserszabreAppDataLocalProgramsPythonPython38-32libsocket.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')  

Комментарии:

1. Братан, ты лучший! server = smtplib.SMTP_SSL('smtp.mail.ru', 465, 'portable') — сработало!