2012-09-06 47 views
5

Estoy tratando de aprender Python de un libro ("Hello! Python"). Este código debería, de acuerdo con el libro, enviar un correo electrónico. sin suerte hasta el momento.Enviando correo electrónico usando email.mime.multipart en Python

import os 

from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
import smtplib 

def send_message(message): 
    s = smtplib.SMTP('smtp.me.com') 
    s.sendmail(message['From'], message['To'], message.as_string()) 
    s.quit() 

def mail_report(to, ticker_name): 
    outer = MIMEMultipart() 
    outer['Subject'] = "Stock report for " + ticker_name 
    outer['From'] = "[email protected]" 
    outer['To'] = to 

    # Internal text container 
    inner = MIMEMultipart('alternative') 
    text = "Here is the stock report for " + ticker_name 
    html = """\ 
    <html> 
     <head></head> 
     <body> 
     <p>Here is teh stock report for 
      <b> """ + ticker_name + """ </b> 
     </p> 
     </body> 
    </html> 
    """ 
    part1 = MIMEText(text, 'plain') 
    part2 = MIMEText(html, 'html') 
    inner.attach(part1) 
    inner.attach(part2) 
    outer.attach(inner) 

    filename = 'stocktracker-%s.csv' % ticker_name 
    csv_text = ''.join(file(filename).readlines()) 
    csv_part = MIMEText(csv_text, 'csv') 
    csv_part.add_header('Content-Disposition', 'attachment', filename=filename), outer.attach(csv_part) 
    return outer 

if __name__ == '__main__': 
    email = mail_report('[email protected]', 'GOOG') 
    send_message(email) 

No recibo ningún error, pero tampoco recibo un correo electrónico. (No hace falta decir que estoy usando mi correo electrónico real, no '[email protected]'). Se agradecieron todas las sugerencias y sugerencias de lectura.

+1

Si quiere enviar un correo electrónico demandando a alguien, debe buscar asesoramiento legal :-) – BrenBarn

+0

no me refiero a ser grueso, pero no lo entiendo. ¿Tengo algún tipo de error estúpido allí? – dwstein

+0

@dwstein: arreglado eso para ti. :-) (detectar la diferencia en el [historial de revisiones posteriores] (http://stackoverflow.com/posts/12307485/revisions)) –

Respuesta

0

smtplib.sendmail eventualmente se generará una excepción si no se puede enviar el correo; puede que tarde un poco en agotarse el tiempo de espera debido a que un cortafuegos interrumpe la conexión. Dale unos minutos. Mientras tanto, lee a continuación sobre lo que podría estar yendo mal.

El código intenta conectarse directamente a smtp.me.com y enviar correo a través de SMTP (puerto 25). Esto sólo funcionará si:

  • Su configuración de Internet le permite realizar conexiones salientes en el puerto 25
  • smtp.me.com escucha en el puerto 25 (que hace)
  • el correo electrónico del destinatario es una dirección válida terminando en @ mac.com ([email protected] no es válido: 550 5.1.1 unknown or illegal alias: [email protected] )
  • smtp.me.com sigue procesando emails sobre @ mac.com (Mobile Me fue cerrado en favor de iCloud hace algún tiempo , así que no estoy seguro de que las direcciones de @ mac.com aún sean válidas)

se puede sustituir cualquier otro servidor de correo para smtp.me.com, preferentemente la de su ISP, que debe estar dispuesto para retransmitir correo electrónico a cualquier dirección (a diferencia de smtp.me.com, que sólo se preocupan por el dominio mac.com).

+0

Gracias! Probé con el servidor de correo para road-runner (smtp-server.nyc.rr.com) y recibí un error que decía que necesitaba autenticación. No estoy seguro por qué. el servidor smtp.me.com terminó funcionando y mi cuenta mac sigue siendo compatible. – dwstein

2

Puede ejecutar un servidor de depuración de smtp local. Encuentra donde se encuentra smtpd.py, a continuación, ejecute el comando:

$ python /usr/lib/python2.7/smtpd.py -n -c DebuggingServer localhost:8025 

Luego, en una segunda pantalla del terminal ejecuta el intérprete de Python: 'Hola'

>>> import smtplib 
>>> s = smtplib.SMTP('localhost', 8025) 
>>> s.sendmail('me', 'you', 'Hi!') 

debería ver en la primera pantalla.

+0

Probé la segunda manera y obtuve el siguiente error: 'socket.error: [Errno 61] Connection refused' – dwstein

+0

@dwstein: ¿Qué quieres decir con la segunda forma? Ejecuta el servidor de depuración de smtp en un terminal y luego ejecuta el código de cliente de Python en otro. –

+0

Gracias. No entendí – dwstein

Cuestiones relacionadas