2012-01-30 6 views
5

Ok ragazzi, ho guardato su Internet da anni e semplicemente non ho potuto trovare una risposta a questo. Ho provato molti suggerimenti ma non riesco a farlo funzionare. Sto tentando di inviare un'email usando python (smtplib e moduli email) e il servizio Gmail. Qui sono i miei pacchetti importati:Invio di email Python TypeError: stringa o buffer previsto

import time, math, urllib2, urllib, os, shutil, zipfile, smtplib, sys 
from email.mime.text import MIMEText 

Ed ecco la mia istruzione DEF per l'invio della e-mail:

def sendmessage(): 
print('== You are now sending an email to Hoxie. Please write your username below. ==') 
mcusername = str(raw_input('>> Username: ')) 
print('>> Now your message.') 
message = str(raw_input('>> Message: ')) 
print('>> Attempting connection to email host...') 
fromaddr = '[email protected]' 
toaddrs = '[email protected]' 
username = '[email protected]' 
password = '1013513403' 
server = smtplib.SMTP('smtp.gmail.com:587') 
subject = 'Email from',mcusername 
content = message 
msg = MIMEText(content) 
msg['From'] = fromaddr 
msg['To'] = toaddrs 
msg['Subject'] = subject 
try: 
    server.ehlo() 
    server.starttls() 
    server.ehlo() 
except: 
    print('!! Could not connect to email host! Check internet connection! !!') 
    os.system('pause') 
    main() 
else: 
    print('>> Connected to email host! Attempting secure login via SMTP...') 
    try: 
     server.login(username,password) 
    except: 
     print('!! Could not secure connection! Stopping! !!') 
     os.system('pause') 
     main() 
    else: 
     print('>> Login succeeded! Attempting to send message...') 
     try: 
      server.sendmail(fromaddr, toaddrs, msg) 
     except TypeError as e: 
      print e 
      print('Error!:', sys.exc_info()[0]) 
      print('!! Could not send message! Check internet connection! !!') 
      os.system('pause') 
      main() 
     else: 
      server.quit() 
      print('>> Message successfully sent! I will respond as soon as possible!') 
      os.system('pause') 
      main() 

ho debug nel modo più ampio oso e ottenere questo:

>> Login succeeded! Attempting to send message... 
TypeError: expected string or buffer 

Il che significa che è riuscito a collegarsi ma si è fermato quando ha provato a inviare il messaggio. Una cosa che mi fa impazzire è che non indica dove. Anche la mia codifica potrebbe non essere così eccezionale, quindi nessun cyber bullismo.

Qualsiasi aiuto sarebbe molto apprezzato! Grazie.

risposta

3

La mia ipotesi è il colpevole è questa linea:

subject = 'Email from',mcusername 

Se vi aspettate di creare soggetto come una stringa, la sua realtà di essere trasformato in una tupla perché si sta passando due valori. Quello che probabilmente voleva fare è:

subject = 'Email from %s' % mcusername 

Inoltre, per l'aspetto debug ... Il modo in cui si sta avvolgendo tutti i tuoi eccezioni e solo la stampa del messaggio di eccezione sta gettando via la traceback utile (se ce n'è uno). Hai provato a non avvolgere tutto fino a quando non conosci davvero l'eccezione specifica che stai cercando di gestire? Fare una gestione delle eccezioni catch-all coperta rende così il debugging più difficile quando si hanno dei bug di sintassi.

6

La linea che sta crash è

server.sendmail(fromaddr, toaddrs, msg) 

si sta dando due stringhe e un'istanza MIMEText; vuole il messaggio sotto forma di stringa. [Penso che vuole anche gli indirizzi nella forma di una lista, ma particolari casi d'una corda.] Ad esempio, è possibile guardare il example in the docs:

s = smtplib.SMTP('localhost') 
s.sendmail(me, [you], msg.as_string()) 
s.quit() 

Dovete convertire i MIMEText in una stringa per sendmail essere felice. Dopo aver corretto l'errore del soggetto che @jdi ha evidenziato (che genera un oggetto "AttributeError: 'tuple' non ha alcun attributo 'lstrip' 'messaggio) e modifica msg a msg.as_string(), il tuo codice funziona per me.