Python: al enviar un correo electrónico, siempre está bloqueado en la cláusula: smtpserver = smtplib.SMTP (“smtp.gmail.com”, 587)

Estoy escribiendo un progtwig de Python para enviar un correo electrónico. Pero cada vez que se ejecuta la cláusula:

smtpserver = smtplib.SMTP("smtp.gmail.com",587) 

se bloqueará aquí y siempre se mantendrá en estado de ejecución sin ninguna indicación ni error. No se por que ¿Y puede alguien ayudarme?

El código es el siguiente: importar smtplib

 to = 'toemail@gmail.com' gmail_user = 'user@gmail.com' gmail_pwd = 'password' smtpserver = smtplib.SMTP("smtp.gmail.com",587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo smtpserver.login(gmail_user, gmail_pwd) header = 'To:' + to + '\n' + 'From: ' + gmail_user + '\n' + 'Subject:testing \n' print header msg = header + '\n this is test msg from mkyong.com \n\n' smtpserver.sendmail(gmail_user, to, msg) print 'done!' smtpserver.close() 

Tal vez llego 4 años tarde, ¡pero esto es lo que funcionó para mí y podría ayudar a alguien más!

 server = smtplib.SMTP("smtp.gmail.com", 587, None, 30) 

Puede haber algún problema con la conexión (¿quizás esté bloqueado por su proxy o firewall?) Y el tiempo de espera puede ser bastante grande para que usted no vea que vaya más allá.

La documentación de smtplib.SMTP dice:

class smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])

(…) Se SMTPConnectError un SMTPConnectError si el host especificado no responde correctamente. El parámetro de timeout opcional especifica un tiempo de espera en segundos para operaciones de locking como el bash de conexión (si no se especifica, se usará la configuración de tiempo de espera predeterminado global).

Intente especificar el tiempo de espera usted mismo:

 smtpserver = smtplib.SMTP("smtp.gmail.com", 587, timeout=30) 

Para referencia, cpython smtplib está bloqueando. Es decir, bloquea la GIL (es decir, Python) mientras se conecta. A pesar de las afirmaciones de que GIL se libera en E / S, solo se libera en algunas E / S, y las conexiones SMTP no lo son. Para hacerlo asíncrono, debe entregar el envío de correo a otro proceso o secuencia, según su situación.