sent - Error al enviar el correo electrónico con el ejemplo de Python
send mails in python (9)
¿Puerto incorrecto tal vez? Estoy usando 587 para smtp.gmail.com y funciona.
He intentado (y he fallado) averiguar cómo enviar correos electrónicos a través de Python.
Intentando con el ejemplo desde aquí: http://docs.python.org/library/smtplib.html#smtplib.SMTP
pero agregué el server = smtplib.SMTP_SSL(''smtp.gmail.com'', 465)
línea server = smtplib.SMTP_SSL(''smtp.gmail.com'', 465)
después de recibir un bounceback por no tener una conexión SSL.
Ahora estoy obteniendo esto:
Traceback (most recent call last):
File "C:/Python26/08_emailconnects/12_29_EmailSendExample_NotWorkingYet.py", line 37, in <module>
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 a continuación).
Estoy probando diferentes puertos y ahora recibo un error completamente nuevo. Voy a publicar todo el código, probablemente estoy cometiendo un error de novato.
"
import smtplib
mailuser = ''[email protected]''
mailpasswd = ''MYPASSWORD''
fromaddr = ''[email protected]''
toaddrs = ''[email protected]''
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 aparece este mensaje de error: "
Traceback (most recent call last):
File "C:/Python26/08_emailconnects/12_29_eMAILSendtryin_stripped.py", line 16, in <module>
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 se ve como "server = smtplib.SMTPSSLPORT = 587" es en realidad "server = smtplib.SMTP underscore SSL underscore PORT = 587", aquí hay algún tipo de cosa de formato.
Aquí hay una solución simple para tirar. Quería pegar esto antes, pero me quedé dormido en mi silla.
import smtplib
import email
import os
username = "[email protected]"
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")
Mi suposición es que la mayoría de las personas en este hilo que han tenido intentos exitosos con su código no están en win32. ;)
* editar: consulte http://docs.python.org/library/email-examples.html para obtener algunos buenos ejemplos "oficiales".
Bien, ¡descubrieron que esta línea de código funciona!
server = smtplib.SMTP (''smtp.gmail.com'', 587)
Resultó ser GMAIL no era compatible con SSL en el puerto 25 (y el puerto 465 causó un bloqueo por alguna razón).
¡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 fuentes 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 aquí hay un parche disponible.
El problema se debe a un error en Python . Intentar crear una conexión con SMTP_SSL fallará con "SMTPServerDisconnected: ejecute connect () primero".
Se ha corregido una corrección, por lo que puede parchar su copia local. Ver el archivo adjunto llamado "smtplib_72551.diff".
(Nota: SMTP_SSL es una nueva clase añadida a Python 2.6 / 3.0 y posterior).
El siguiente código funciona para mí:
import smtplib
FROMADDR = "[email protected]"
LOGIN = FROMADDR
PASSWORD = "my.real.password"
TOADDRS = ["[email protected]"]
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.
Editar : cambió el puerto de 25 a 587 según lo sugerido por ΤΖΩΤΖΙΟΥ, y soltó el segundo ehlo (). Ahora me gustaría saber por qué el puerto 25 funciona perfectamente desde mi máquina (y el puerto 465 no ).
La forma correcta de conectarse a GMail mediante SSL es:
server = smtplib.SMTP(''smtp.gmail.com'', 587)
El puerto 465 parece causar retrasos. Ambos puertos se especifican en las preguntas frecuentes 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.
from smtplib import SMTP_SSL as SMTP
from email.mime.text import MIMEText
HOST = ''smtp.gmail.com''
PORT = 465
USERNAME = ''[email protected]''
PASSWORD = ''''
SENDER = ''[email protected]''
RECIPIENT = ''[email protected]''
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, 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 protected]'',''password'')
mail.sendmail(''[email protected]'', ''[email protected]'', content)
mail.close()