Python 2: SMTPServerDisconnected: la conexión se cerró inesperadamente

Tengo un pequeño problema con el envío de un correo electrónico en Python:

#me == my email address #you == recipient's email address me = "some.email@gmail.com" you = "some_email2@gmail.com" # 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 = '

Hi, I have the following alerts for you!

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

Así que antes, mi progtwig no me dio un error, pero tampoco me envió un correo electrónico. Y ahora Python me da un error:

 SMTPServerDisconnected: Connection unexpectedly closed 

¿Cómo puedo arreglar esto?

Lo más probable es que el servidor de gmail haya rechazado la conexión después del comando de datos (muy desagradable de ellos en esta etapa :). El mensaje real es muy probablemente este:

  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 

¿Cómo sé eso? Porque lo he probado 🙂 con s.set_debuglevel(1) , que imprime la conversación SMTP y puedes ver de primera mano cuál es el problema.

Tienes dos opciones aquí:

  1. Continúa usando ese relevo; tal como lo explica Google , solo está sin cifrar de gmail a gmail, y debe eliminar la lista negra de su ip a través de su procedimiento

  2. La opción más infalible es cambiar a TLS con autenticación

Así es como se ve la fuente cambiada:

 # skipped your comments for readability import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText me = "some.email@gmail.com" my_password = r"your_actual_password" you = "some.email2@gmail.com" msg = MIMEMultipart('alternative') msg['Subject'] = "Alert" msg['From'] = me msg['To'] = you html = '

Hi, I have the following alerts for you!

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

Ahora, si intenta “engañar” al sistema y enviarlo con una dirección diferente (que no sea de Gmail), a) le requerirá que se conecte a un nombre de host diferente (algunos de los registros MX de gmail), entonces b) lo detenga y cierre la conexión por el IP de la lista negra, yc) invierte DNS, DKIM y muchas otras contramedidas para asegurarse de que realmente está en control del dominio que presentó en la dirección MAIL FROM:.

Finalmente, también está la opción 3): usar cualquier otro servicio de retransmisión de correo electrónico, hay un montón de buenos 🙂

Tuve el mismo problema y lo resolví simplemente especificando el puerto correcto como este:

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

Usar smtplib.SMTP_SSL() lugar de smtplib.SMTP() funciona para mí. Prueba esto.

Me he dado cuenta de un comportamiento extraño. He utilizado códigos similares mencionados tanto en la pregunta como en las respuestas. Mi código ha estado trabajando durante los últimos días. Sin embargo, hoy me encontré con el mensaje de error mencionado en la pregunta.

Mi solución: había intentado mi bash exitoso a través de la red de la biblioteca. Hoy lo he intentado a través de la red de Starbucks (a través del portal cautivo). Lo cambié a mi red móvil. Comenzó a funcionar de nuevo.

Posiblemente, Google rechaza solicitudes de redes poco confiables.

Estaba enfrentando el mismo problema. En mi caso, la contraseña se cambió hace apenas unos días. Por lo tanto, estaba dando el error. ¡Como actualicé la contraseña en el código, está funcionando a la perfección …!