2012-02-14 33 views
8

Estoy escribiendo un programa que envía un correo electrónico usando Python. Lo que he aprendido de diversos foros es el siguiente fragmento de código:¿Cómo puedo enviar correos electrónicos usando Python?

#!/usr/bin/env python 
import smtplib 
sender = "[email protected]" 
receivers = ["[email protected]"] 
yourname = "Abhishek Sagar" 
recvname = "receptionist" 
sub = "Testing email" 
body = "who cares" 
message = "From: " + yourname + "\n" 
message = message + "To: " + recvname + "\n" 
message = message + "Subject: " + sub + "\n" 
message = message + body 
try: 
    print "Sending email to " + recvname + "...", 
    server = smtplib.SMTP('smtp.gmail.com:587') 
    username = '[email protected]' 
    password = '*****' 
    server.ehlo() 
    server.starttls() 
    server.login(username,password) 
    server.sendmail(sender, receivers, message)   
    server.quit() 
    print "successfully sent!" 
except Exception: 
    print "Error: unable to send email" 

pero es simplemente imprimiendo "" Error: No se puede enviar un correo electrónico". Y sale a cabo en el terminal ¿Cómo puede resolver este

?

he modificado las dos últimas líneas de

except Exception, error: 
    print "Unable to send e-mail: '%s'." % str(error) 

me sale el siguiente mensaje de error:

Traceback (most recent call last): 
    File "./2.py", line 45, in <module> 
    smtpObj = smtplib.SMTP('localhost') 
    File "/usr/lib/python2.6/smtplib.py", line 239, in __init__ 
    (code, msg) = self.connect(host, port) 
    File "/usr/lib/python2.6/smtplib.py", line 295, in connect 
    self.sock = self._get_socket(host, port, self.timeout) 
    File "/usr/lib/python2.6/smtplib.py", line 273, in _get_socket 
    return socket.create_connection((port, host), timeout) 
    File "/usr/lib/python2.6/socket.py", line 514, in create_connection 
    raise error, msg 
socket.error: [Errno 111] Connection refused 
+0

Veo que eres nuevo en stackoverflow, bienvenido! Asegúrese de utilizar la [ayuda de edición] (http://stackoverflow.com/editing-help) para formatear correctamente sus publicaciones. Esto nos ayuda a leer su pregunta más fácilmente y aumenta sus posibilidades de obtener una respuesta. –

+1

posible duplicado de [Envío de correo de Python usando SMTP] (http://stackoverflow.com/questions/64505/sending-mail-from-python-using-smtp) –

Respuesta

15

Si encabezados de los mensajes, la carga útil contienen caracteres no ASCII entonces deben ser codificados:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
from email.header import Header 
from email.mime.text import MIMEText 
from getpass   import getpass 
from smtplib   import SMTP_SSL 


login, password = '[email protected]', getpass('Gmail password:') 
recipients = [login] 

# create message 
msg = MIMEText('message body…', 'plain', 'utf-8') 
msg['Subject'] = Header('subject…', 'utf-8') 
msg['From'] = login 
msg['To'] = ", ".join(recipients) 

# send it via gmail 
s = SMTP_SSL('smtp.gmail.com', 465, timeout=10) 
s.set_debuglevel(1) 
try: 
    s.login(login, password) 
    s.sendmail(msg['From'], recipients, msg.as_string()) 
finally: 
    s.quit() 
+0

Gmail ahora es bastante estricto con los dispositivos que pueden iniciar sesión en la cuenta.Si, como yo, tiene problemas al usar código como este en una máquina remota, puede intentar iniciar sesión en la cuenta de Gmail y marcar la opción "Permitir aplicaciones menos seguras". También hay herramientas para autorizar aplicaciones específicas – jprockbelly

+1

@jprockbelly: no comprometa la seguridad. Funciona incluso en la cuenta con verificación en dos pasos. Simplemente genere una contraseña de aplicación para su script. – jfs

6

Si imprime el mensaje de error, es probable que obtenga una descripción completa de que ocurrió el error. Intentar (sin doble sentido) esto:

try: 
    # ... 
except Exception, error: 
    print "Unable to send e-mail: '%s'." % str(error) 

Si, después de leer el mensaje de error, todavía no comprende su error, por favor, actualice su pregunta con el mensaje de error y le podemos ayudar un poco más.


Update después de información adicional:

el mensaje de error

socket.error: [Errno 111] Connection refused

significa el extremo remoto (por ejemplo el servidor de Gmail SMTP) se niega la conexión de red. Si se echa un vistazo en el smtplib.SMTP constructor, parece que debe cambiar

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

a lo siguiente.

server = smtplib.SMTP(host='smtp.gmail.com', port=587) 
+0

después de hacer lo que usted dijo, me aparece el siguiente error: Enviando un correo electrónico a la recepcionista ... No se pudo enviar un correo electrónico: '[Errno 110] Tiempo de espera de conexión agotado'. Estoy detrás del proxy, así que necesito agregar algo extra al código. –

+0

@AbhishekSagar: la configuración de SMTP es un tema complejo. Tal vez puedes probar uno de los puertos alternativos? Consulte [configuración de otros clientes de correo electrónico] (http://support.google.com/mail/bin/answer.py?hl=es&answer=13287) en las preguntas frecuentes de GMail. –

+0

sí, instalo postfix, y abandoné la idea cuando busqué la configuración del SMTP. es realmente complejo –

0

De acuerdo con el mensaje de error, utilice el localhost como el servidor SMTP, entonces la conexión fue rechazada. Su servidor local no tenía un servidor SMTP en ejecución. Supongo que debe asegurarse de que el servidor SMTP que conecta sea válido.

+0

hmmm, ok! Déjame ver. Gracias por señalar esto. –

Cuestiones relacionadas