#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')
— сработало!