No enviar correo electrónico con el ejemplo de Python

He estado intentando (y fallando) descubrir cómo enviar correos electrónicos a través de Python.

Probando el ejemplo desde aquí: http://docs.python.org/library/smtplib.html#smtplib.SMTP

pero agregó el server = smtplib.SMTP_SSL('smtp.gmail.com', 465) línea server = smtplib.SMTP_SSL('smtp.gmail.com', 465) después de que obtuve un rebote de no tener una conexión SSL.

Ahora estoy recibiendo esto:

 Traceback (most recent call last): File "C:/Python26/08_emailconnects/12_29_EmailSendExample_NotWorkingYet.py", line 37, in  server = smtplib.SMTP('smtp.gmail.com', 65) File "C:\Python26\lib\smtplib.py", line 239, in __init__ (code, msg) = self.connect(host, port) File "C:\Python26\lib\smtplib.py", line 295, in connect self.sock = self._get_socket(host, port, self.timeout) File "C:\Python26\lib\smtplib.py", line 273, in _get_socket return socket.create_connection((port, host), timeout) File "C:\Python26\lib\socket.py", line 512, in create_connection raise error, msg error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond >>> 

¿Pensamientos?


server = smtplib.SMTP (“smtp.google.com”, 495) me da un error de tiempo de espera. simplemente smtplib.smtp (“smtp.google.com”, 495) me da “SSLError: [Errno 1] _ssl.c: 480: error: 140770FC: Rutinas SSL: SSL23_GET_SERVER_HELLO: protocolo desconocido” (ver más abajo).

Estoy probando diferentes puertos y ahora estoy recibiendo un error completamente nuevo. Solo publicaré todo el código, probablemente estoy cometiendo un error de novato.

 import smtplib mailuser = 'MYEMAIL@gmail.com' mailpasswd = 'MYPASSWORD' fromaddr = 'MYEMAIL@gmail.com' toaddrs = 'MYEMAIL2@gmail.com' msg = 'Hooooorah!' print msg server = smtplib.SMTP_SSL('smtp.google.com') server = smtplib.SMTP_SSL_PORT=587 server.user(mailuser) server.pass_(mailpasswd) server.set_debuglevel(1) server.sendmail(fromaddr, toaddrs, msg) server.quit() 

y luego me sale este mensaje de error: ”

 Traceback (most recent call last): File "C:/Python26/08_emailconnects/12_29_eMAILSendtryin_stripped.py", line 16, in  server = smtplib.SMTP_SSL('smtp.google.com') File "C:\Python26\lib\smtplib.py", line 749, in __init__ SMTP.__init__(self, host, port, local_hostname, timeout) File "C:\Python26\lib\smtplib.py", line 239, in __init__ (code, msg) = self.connect(host, port) File "C:\Python26\lib\smtplib.py", line 295, in connect self.sock = self._get_socket(host, port, self.timeout) File "C:\Python26\lib\smtplib.py", line 755, in _get_socket self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile) File "C:\Python26\lib\ssl.py", line 350, in wrap_socket suppress_ragged_eofs=suppress_ragged_eofs) File "C:\Python26\lib\ssl.py", line 118, in __init__ self.do_handshake() File "C:\Python26\lib\ssl.py", line 293, in do_handshake self._sslobj.do_handshake() SSLError: [Errno 1] _ssl.c:480: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol 

tenga en cuenta que en realidad el que parece ser “server = smtplib.SMTPSSLPORT = 587” es en realidad “server = smtplib.SMTP subrayado SSL subrayado PORT PORT = 587″, hay algún tipo de cosa de formato que está ocurriendo aquí.

El siguiente código funciona para mí:

 import smtplib FROMADDR = "my.real.address@gmail.com" LOGIN = FROMADDR PASSWORD = "my.real.password" TOADDRS = ["my.real.address@gmail.com"] SUBJECT = "Test" msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (FROMADDR, ", ".join(TOADDRS), SUBJECT) ) msg += "some text\r\n" server = smtplib.SMTP('smtp.gmail.com', 587) server.set_debuglevel(1) server.ehlo() server.starttls() server.login(LOGIN, PASSWORD) server.sendmail(FROMADDR, TOADDRS, msg) server.quit() 

Estoy usando Python 2.5.2.

Edición : se cambió el puerto de 25 a 587 según lo sugerido por, y se dejó caer el segundo ehlo (). Ahora me encantaría saber por qué el puerto 25 funciona perfectamente desde mi máquina (y el puerto 465 no lo hace).

La forma correcta de conectarse a GMail utilizando SSL es:

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

El puerto 465 parece causar retrasos. Ambos puertos se especifican en un FAQ de Gmail .

Tenga en cuenta que el uso del puerto 587 es más común para SMTP sobre SSL, aunque esto es solo información trivial, no tiene otro uso práctico.

Esta respuesta se proporciona como wiki de la comunidad para ser elegida como “la” respuesta. Por favor, mejora según sea necesario.

El problema se debe a un error en Python . Intentar crear una conexión con SMTP_SSL fallará con “SMTPServerDisconnected: primero ejecute connect ()”.

Se ha confirmado una solución para que pueda parchear su copia local. Consulte el archivo adjunto denominado “smtplib_72551.diff”.

(Nota: SMTP_SSL es una nueva clase agregada a Python 2.6 / 3.0 y posterior).

Aquí hay una solución de tiro simple. Pretendía pegar esto antes, pero se quedó dormido en mi silla.

 import smtplib import email import os username = "user@gmail.com" passwd = "password" def mail(to, subject, text, attach): msg = MIMEMultipart() msg['From'] = username msg['To'] = to msg['Subject'] = subject msg.attach(MIMEText(text)) part = MIMEBase('application', 'octet-stream') part.set_payload(open(attach, 'rb').read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(attach)) msg.attach(part) server = smtplib.SMTP("smtp.gmail.com", 495) server.ehlo() server.starttls() server.ehlo() server.login(username, passwd) server.sendmail(username, to, msg.as_string()) server.close() mail("you", "hi", "hi", "webcam.jpg") 

Supongo que la mayoría de las personas en este hilo que han tenido bashs exitosos con su código no están en win32. 😉

* edición: consulte http://docs.python.org/library/email-examples.html para ver algunos buenos ejemplos “oficiales”.

Bien, ¡descubrí que esta línea de código hace el truco!

server = smtplib.SMTP (‘smtp.gmail.com’, 587)

Resultó que GMAIL no era compatible con SSL en el puerto 25 (y el puerto 465 causó un locking por algún motivo).

¡Gracias chicos!

Debería verificar su puerto, no estoy seguro de que el puerto SMTP de Google sea 65, eso explicaría el tiempo de espera.

Modifique sus fonts como tales:

smtplib.SMTP_SSL (‘smtp.google.com’, 465)

Sin embargo, si está seguro de que debería funcionar y no funciona, parece que hay algunos problemas con smtplib.SMTP_SSL, y hay un parche disponible para ello aquí .

Puerto incorrecto tal vez? Estoy usando 587 para smtp.gmail.com y funciona.

 from smtplib import SMTP_SSL as SMTP from email.mime.text import MIMEText HOST = 'smtp.gmail.com' PORT = 465 USERNAME = 'oltjano13@gmail.com' PASSWORD = '' SENDER = 'oltjano13@gmail.com' RECIPIENT = 'oltjano13@gmail.com' text_subtype = 'plain' with open('textfile', 'rb') as f: msg = MIMEText(f.read(), text_subtype) msg['Subject'] = 'Python Script' msg['From'] = SENDER msg['To'] = RECIPIENT try: connection = SMTP(HOST, PORT) connection.login(USERNAME, PASSWORD) connection.sendmail(SENDER, RECIPIENT, msg.as_string()) except Exception, e: print(e) 

El código anterior funciona bien para mí. Como puede ver, el PORT = 465 se está utilizando en este ejemplo ya que estoy usando SSL . Si planea usar el puerto 587 entonces se requiere TLS .

 import smtplib content = 'example email stuff here' mail = smtplib.SMTP('smtp.gmail.com', 587) mail.ehlo() mail.starttls() mail.login('email@gmail.com','password') mail.sendmail('email@gmail.com', 'email@yahoo.com', content) mail.close()