web-dev-qa-db-fra.com

Python 2: SMTPServerDisconnected: connexion inopinément fermée

J'ai un petit problème avec l'envoi d'un email en Python:

#me == my email address
#you == recipient's 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's address, recipient's address
# and message to send - here it is sent as one string.
s.sendmail(me, you, msg.as_string())
s.quit()

Donc, avant maintenant, mon programme ne m'a pas donné d'erreur, mais il ne m'a également pas envoyé d'e-mail. Et maintenant python me donne une erreur:

SMTPServerDisconnected: Connection unexpectedly closed

Comment puis-je réparer cela?

16
Michael

Le serveur gmail a probablement rejeté la connexion après la commande data (très méchant de le faire à ce stade :). Le message réel est très probablement celui-ci:

    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

Comment le sais-je? Parce que je l'ai essayé :) avec la s.set_debuglevel(1), qui imprime la conversation SMTP et vous pouvez voir de première main quel est le problème.

Vous avez deux options ici:

  1. Continuez à utiliser ce relais; comme expliqué par Google , c'est gmail-à-gmail non crypté uniquement, et vous devez annuler la mise sur liste noire de votre ip via leur procédure

  2. L'option la plus infaillible consiste à passer à TLS avec authentification

Voici à quoi ressemble la source modifiée:

# 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's 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()

Maintenant, si vous essayez de `` tricher '' le système et d'envoyer avec une adresse différente (non gmail), cela va a) vous obliger à vous connecter à un autre nom d'hôte (certains des enregistrements MX pour gmail), puis b) vous arrêter et fermer la connexion sur la base de l'IP sur liste noire, et c) inversez DNS, DKIM et bien d'autres contre-mesures pour vous assurer que vous contrôlez réellement le domaine que vous avez présenté dans l'adresse MAIL FROM :.

Enfin, il y a aussi l'option 3) - utilisez tout autre service de relais de messagerie, il y en a des tonnes :)

10
Todor Minakov

J'ai eu le même problème et l'ai résolu simplement en spécifiant le bon port comme ceci:

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

J'ai réalisé un comportement étrange. J'ai utilisé des codes similaires mentionnés à la fois la question et les réponses. Mon code fonctionne depuis les derniers jours. Cependant, aujourd'hui, j'ai rencontré le message d'erreur mentionné dans la question.

Ma solution: j'avais essayé ma tentative réussie via le réseau de bibliothèques. Aujourd'hui, je l'ai essayé via le réseau Starbucks (via un portail captif). Je l'ai changé pour mon réseau mobile. Il a recommencé à fonctionner.

Il est possible que Google rejette les demandes de réseaux non fiables.

1
Onur Tuna

Utiliser smtplib.SMTP_SSL() au lieu de smtplib.SMTP() fonctionne pour moi. Essaye ça.

1

J'étais confronté au même problème. Dans mon cas, le mot de passe a été changé il y a quelques jours. Donc, ça donnait l'erreur. Comme j'ai mis à jour le mot de passe dans le code, cela fonctionne comme un charme ... !!!

1
Sohel Pathan

Googlers: j'avais un serveur smtp de test fonctionnant localement. J'obtenais cette erreur parce que j'arrêtais le serveur smtp local avant de fermer le smtp client.

0
Daniel Butler