2016-06-09 36 views
1

Ich versuche, eine xlsx-Datei an meine E-Mail anzuhängen. Ich suchte nach Lösungen und es beinhaltet die Verwendung von email.encoders. Aber wenn ich diese Lösung verwende, erhalte ich einen Fehler. Ich verwende eine Lösung, an der jemand anderes arbeitet.Objekt hat kein Attribut 'encode'

File "C:\Documents and Settings\Desktop\AppTera\dev\MTC_test\MTC_sender.py", line 41, in sendmail 
    s.sendmail(FROMADDR, TOADDR, message.as_string()) 
AttributeError: 'list' object has no attribute 'encode' 
def sendmail(): 
     SERVER = 'server.com' 
     FROMADDR = "[email protected]" 
     TOADDR = ['[email protected]'] 
     CCADDR = ['[email protected]'] 

     message = MIMEMultipart('mixed') 
     message['From'] = FROMADDR 
     message['To'] = TOADDR 
     message['Subject'] = "Reporting for IVR Application" 

     BODY = "Hello Angela,\n\nI'm attaching the reports for %s/%s. These are the same reports\ 
you have requested in the past.\n\nPlease let me know if you need any additional reports.\n\n\ 
Thank you"% (str(MONTH), str(YEAR)) 
     message.attach(MIMEText(BODY, 'plain')) 

     filename = "results.csv.xlsx" 
     path = r'C:\Documents and Settings\Desktop\MonthlyReports\MTC\%s_%s' % (str(YEAR), str(MONTH)) 
     os.chdir(path) 
     fileMsg = MIMEBase('application', 'xlsx') 
     fileMsg.set_payload(open('results.csv.xlsx', 'rb').read()) 
     encoders.encode_base64(fileMsg) 
     fileMsg.add_header('Content-Disposition','attachment;filename=results.csv.xls') 
     message.attach(fileMsg) 


     s = smtplib.SMTP(SERVER, 25) 
     s.set_debuglevel(1) 
     s.sendmail(FROMADDR, TOADDR, message.as_string()) 
     s.quit() 

Gibt es eine andere Möglichkeit, dass ich eine angehängte Datei zusammen mit einem Körper Nachricht senden kann?

+1

Ich spielte mit Ihrem Code ein bisschen herum, und es funktioniert, wenn 'TOADDR' eine einfache Zeichenfolge anstelle einer Liste ist. Die Doktoren sagen, dass es eine Liste sein kann, also weiß ich nicht, warum das passiert. –

+0

Danke, das hat den Job gemacht. – FatFockFrank

Antwort

1

s ist ein SMTP-Objekt, das Sie von s = smtplib.SMTP(SERVER, 25) erstellt haben. Also sollten die Parameter für s.sendmail(FROMADDR, TOADDR, message.as_string()) entsprechend der documentation sein.

SMTP.sendmail (from_addr, to_addrs, msg [, mail_options, rcpt_options])

Mail schicken. Die erforderlichen Argumente sind ein RFC 822 Absenderadresse, eine Liste von RFC 822 To-Adresse Zeichenfolgen (eine leere Zeichenfolge wird als eine Liste mit 1 Adresse behandelt werden) und eine Nachrichtenzeichenfolge. Der Aufrufer kann eine Liste von ESMTP-Optionen (z. B. 8 Bitmime) übergeben, die in MAIL FROM-Befehlen als mail_options verwendet werden. ESMTP-Optionen (z. B. DSN-Befehle), die für alle RCPT-Befehle verwendet werden sollen, können als rcpt_options übergeben werden. (Wenn Sie unterschiedliche ESMTP Optionen an verschiedene Empfänger verwenden müssen, müssen Sie die Low-Level-Methoden wie E-Mail(), rcpt() und Daten(), um die Nachricht zu senden.)

Stellen Sie sicher, fromaddr ist eine Zeichenkette (keine Liste), sollte TOADDR eine Zeichenkette oder eine Liste der Zeichenketten sein (die RFC 822 email Formatzeichenfolgen sind).

+0

Das Problem liegt im Attachment-Teil von sendmail. Sie können sehen, dass sowohl TOADDR als auch FROMADDR eine einzelne Zeichenfolge sind. – FatFockFrank

+0

Versuchen Sie, "message" und "message.as_string()" zu drucken, nachdem Sie den "['From'], [To ']" - und [' Subject '] '-Teil zugewiesen haben. – Rahul

+1

Verwenden Sie für mehrere Empfänger 'msg ['To'] = ',' .join (Empfänger)' – citynorman

Verwandte Themen