Python 2: SMTPServerDisconnected: соединение неожиданно закрыто

У меня небольшая проблема с отправкой электронного письма в Python:

#me == my email address
#you == recipient email address
me = "[email protected]"
you = "[email protected]"

# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = "Alert"
msg['From'] = me
msg['To'] = you

# Create the body of the message (a plain-text and an HTML version).
html = '<html><body><p>Hi, I have the following alerts for you!</p></body></html>'

# Record the MIME types of both parts - text/plain and text/html.
part2 = MIMEText(html, 'html')

# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part2)

# Send the message via local SMTP server.
s = smtplib.SMTP('aspmx.l.google.com')
# sendmail function takes 3 arguments: sender address, recipient address
# and message to send - here it is sent as one string.
s.sendmail(me, you, msg.as_string())
s.quit()

Поэтому до сих пор моя программа не выдала мне ошибку, но также не отправила мне электронное письмо. И теперь Python выдает мне ошибку:

SMTPServerDisconnected: Connection unexpectedly closed

Как я могу это исправить?

Ответ 1

Скорее всего, сервер gmail отклонил соединение после команды данных (очень противно им делать это на этом этапе:). Фактическое сообщение, скорее всего, таково:

    retcode (421); Msg: 4.7.0 [ip.octets.listed.here      15] Our system has detected an unusual rate of
    4.7.0 unsolicited mail originating from your IP address. To protect our
    4.7.0 users from spam, mail sent from your IP address has been temporarily
    4.7.0 rate limited. Please visit
    4.7.0  https://support.google.com/mail/answer/81126 to review our Bulk Email
    4.7.0 Senders Guidelines. qa9si9093954wjc.138 - gsmtp

Откуда я знаю это? Потому что я пробовал это:) с помощью s.set_debuglevel(1), который печатает SMTP-разговор, и вы можете увидеть из первых рук, в чем проблема.

У вас есть два варианта:

  • Продолжайте использовать это реле; как объясняется Google, это незашифрованный gmail-to-gmail, и вы должны зачеркнуть свой ip через свою процедуру

  • Самым надежным вариантом является переход на TLS с аутентификацией

Здесь, как выглядит измененный источник:

# skipped your comments for readability
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

me = "[email protected]"
my_password = r"your_actual_password"
you = "[email protected]"

msg = MIMEMultipart('alternative')
msg['Subject'] = "Alert"
msg['From'] = me
msg['To'] = you

html = '<html><body><p>Hi, I have the following alerts for you!</p></body></html>'
part2 = MIMEText(html, 'html')

msg.attach(part2)

# Send the message via gmail regular server, over SSL - passwords are being sent, afterall
s = smtplib.SMTP_SSL('smtp.gmail.com')
# uncomment if interested in the actual smtp conversation
# s.set_debuglevel(1)
# do the smtp auth; sends ehlo if it hasn't been sent already
s.login(me, my_password)

s.sendmail(me, you, msg.as_string())
s.quit()

Теперь, если попытаться "обмануть" систему и отправить другим (не-gmail) адресом, который он хочет: a) потребовать, чтобы вы подключились к другому имени хоста (некоторые из записей MX для gmail), затем b) остановить вы и закройте соединение на основе черного списка ip и c) сделайте обратный DNS, DKIM и множество других контрмер, чтобы убедиться, что вы фактически контролируете домен, который вы представили в адресе MAIL FROM:.

Наконец, есть также опция 3) - используйте любую другую услугу ретрансляции электронной почты, есть много хороших:)

Ответ 2

У меня была такая же проблема и она была решена, указав правильный порт следующим образом:

smtplib.SMTP('smtp.gmail.com', 587)

Ответ 3

Использование smtplib.SMTP_SSL() вместо smtplib.SMTP() работает для меня. Попробуйте это.

Ответ 4

Я понял странное поведение. Я использовал такие же коды, как и вопрос, и ответы. Мой код работает последние дни. Однако сегодня я столкнулся с сообщением об ошибке, упомянутым в вопросе.

Мое решение: Я попробовал свою успешную попытку через библиотечную сеть. Сегодня я пробовал это через сеть Starbucks (по доступному порталу). Я изменил его на свою мобильную сеть. Он снова начал работать.

Возможно, Google отклоняет запросы от ненадежных сетей.

Ответ 5

Я столкнулся с той же проблемой. В моем случае пароль был изменен всего несколько дней назад. Таким образом, это дало ошибку. Когда я обновил пароль в коде, он работает как шарм... !!!

Ответ 6

Googlers: у меня был тестовый SMTP-сервер, работающий локально. Я получал эту ошибку, потому что я закрывал локальный сервер SMTP, прежде чем закрывать клиент SMTP.