Задать вопрос
@Deerol

Ошибки при отправке email через smtp Python?

Пробую отправить email, используя такой код:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# от кого
fromaddr = "указываю свой email"
# кому
toaddr = "указываю получателя"
# пароль
mypass = "указываю свой пароль"

msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "Удачная тема"

body = "Успешное сообщение"
msg.attach(MIMEText(body, 'plain'))

# server = smtplib.SMTP_SSL('smtp.mail.ru', 465)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()

server.login(fromaddr, mypass)
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()


Но при попытке отправить, консоль выдает такую ошибку:

Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\test\test.py", line 24, in <module>
    server.login(fromaddr, mypass)
  File "C:\Python\Python310\lib\smtplib.py", line 720, in login
    advertised_authlist = self.esmtp_features["auth"].split()
KeyError: 'auth'


Почта и пароль правильные 100%.

При этом, если я в коде поменяю порт на с 587 на 465, то будет уже такая ошибка:

Traceback (most recent call last):
  File "C:\Users\User\PycharmProjects\test\test.py", line 21, in <module>
    server = smtplib.SMTP('smtp.gmail.com', 465)
  File "C:\Python\Python310\lib\smtplib.py", line 255, in __init__
    (code, msg) = self.connect(host, port)
  File "C:\Python\Python310\lib\smtplib.py", line 343, in connect
    (code, msg) = self.getreply()
  File "C:\Python\Python310\lib\smtplib.py", line 405, in getreply
    raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed


Это проблема с портами? Я просил провайдера открыть 25 и 465 порты. Он сказал, что открыл, но сервисы проверки портов показывают, что они все равно закрыты. Также, провайдер сказал, чтобы открыть 587 порт, нужно купить у него выделенный IP.

Но, если использовать другой код, то все отлично отправляется. Вот пример кода, который работает и отправляет сообщения:

import smtplib

# данные почтового сервиса
user = "указываю свой email"
passwd = "указываю свой пароль"
server = "smtp.gmail.com"
port = 587

# тема письма
subject = "Тестовое письмо от Python."
# кому
to = "указываю получателя"
# кодировка письма
charset = 'Content-Type: text/plain; charset=utf-8'
mime = 'MIME-Version: 1.0'
# текст письма
text = "Отправкой почты управляет Python!"

# формируем тело письма
body = "\r\n".join((f"From: {user}", f"To: {to}",
       f"Subject: {subject}", mime, charset, "", text))

try:
    # подключаемся к почтовому сервису
    smtp = smtplib.SMTP(server, port)
    smtp.starttls()
    smtp.ehlo()
    # логинимся на почтовом сервере
    smtp.login(user, passwd)
    # пробуем послать письмо
    smtp.sendmail(user, to, body.encode('utf-8'))
except smtplib.SMTPException as err:
    print('Что - то пошло не так...')
    raise err
finally:
    smtp.quit()


Подскажите пожалуйста, почему первый код выдает ошибки, а второй работает? Да я понимаю, что можно использовать 2-ой и не париться, но я хочу понять, что не так с первым кодом. Потому что большинство программ по отправке email через Python, которые я нахожу в интернете выдают мне такие же ошибки, как первый код и я не могу понять, в чем дело.
  • Вопрос задан
  • 978 просмотров
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
Скопировал к себе оба кода и запустил.
Оба работают.

Старался нарушить логику, но ошибки такой не увидел.

KeyError ошибка вылазит тогда, когда не хватает какого-то аргумента. В данном случае auth. Может что-то поломалось в файлах?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы