2012-09-06 20 views
5

Sto cercando di imparare Python da un libro ("Hello! Python"). Questo codice dovrebbe, secondo il libro, inviare una email. senza fortuna finora.Invio di email tramite email.mime.multipart in 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) 

Non ricevo un errore, ma non ricevo neanche un'email. (inutile dire che sto usando la mia vera e-mail, non "[email protected]") Tutti i suggerimenti e le letture suggerite sono apprezzate.

+1

Se si desidera inviare un'e-mail citando qualcuno si dovrebbe cercare un parere legale :-) – BrenBarn

+0

non intendo essere spessa, ma non capisco. Ho qualche errore di battitura? – dwstein

+0

@ dwstein: corretto quello per ya. :-) (trova la differenza nella [cronologia delle revisioni post] (http://stackoverflow.com/posts/12307485/revisions)) –

risposta

0

smtplib.sendmail alla fine dovrebbe generare un'eccezione se non è possibile inviare la posta - potrebbe essere necessario un po 'di tempo per il timeout a causa della caduta della connessione da parte di un firewall. Dagli qualche minuto. Nel frattempo, leggi sotto su cosa potrebbe andare storto.

Il codice tenta di connettersi direttamente a smtp.me.com e inviare posta tramite SMTP (porta 25). Questo funziona solo se:

  • La configurazione Internet permette di effettuare connessioni in uscita sulla porta 25
  • smtp.me.com in ascolto sulla porta 25 (lo fa)
  • l'e-mail destinatario è un indirizzo valido fine in @ mac.com ([email protected] non è valido: 550 5.1.1 unknown or illegal alias: [email protected] )
  • smtp.me.com processi ancora in una mail per @ mac.com (mobile Me è stato chiuso a favore di iCloud qualche tempo fa , quindi non sono sicuro che gli indirizzi di @ mac.com siano ancora validi)

Si può sostituire qualsiasi altro server di posta per smtp.me.com, preferibilmente quello del proprio ISP, che dovrebbe essere disposta a trasmettere e-mail a qualsiasi indirizzo (a differenza smtp.me.com, che non farà che preoccupano il dominio mac.com).

+0

Grazie! Ho provato il server di posta per road-runner (smtp-server.nyc.rr.com) e ho ricevuto un errore che diceva che avevo bisogno di autenticazione. Non so perché. il server smtp.me.com ha funzionato e il mio account mac è ancora supportato. – dwstein

2

È possibile eseguire un server di debug smtp locale. Trovare dove si trova smtpd.py, quindi eseguire il comando:

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

Poi su un secondo schermo del terminale eseguito l'interprete Python: 'Ciao'

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

si dovrebbe vedere nella prima schermata.

+0

Ho provato il secondo modo e ho ricevuto il seguente errore: 'socket.error: [Errno 61] Connessione rifiutata' – dwstein

+0

@dwstein: Che cosa intendi, il secondo modo? Si esegue il server di debug smtp in un terminale, quindi si esegue il codice client Python in un altro. –

+0

Grazie. Non ho capito – dwstein