2012-05-06 18 views
7

Ho esaminato molti tutorial e altre domande qui sullo stack overflow e la documentazione e le spiegazioni sono al minimo, solo codice non spiegato. Vorrei inviare un file che ho già zippato e inviarlo come allegato. Ho provato a copiare e incollare il codice fornito, ma non funziona, quindi non posso risolvere il problema.Come inviare un file zip come allegato in python?

Quindi, quello che sto chiedendo è se qualcuno sa a chi spiegare come smtplib e le e-mail e le librerie MIME lavorano insieme per inviare un file, in particolare, come farlo con un file zip. Qualsiasi aiuto sarebbe apprezzato.

Questo è il codice che si riferisce a tutti:

import smtplib 
import zipfile 
import tempfile 
from email import encoders 
from email.message import Message 
from email.mime.base import MIMEBase 
from email.mime.multipart import MIMEMultipart  

def send_file_zipped(the_file, recipients, sender='[email protected]'): 
    myzip = zipfile.ZipFile('file.zip', 'w') 

    # Create the message 
    themsg = MIMEMultipart() 
    themsg['Subject'] = 'File %s' % the_file 
    themsg['To'] = ', '.join(recipients) 
    themsg['From'] = sender 
    themsg.preamble = 'I am not using a MIME-aware mail reader.\n' 
    msg = MIMEBase('application', 'zip') 
    msg.set_payload(zf.read()) 
    encoders.encode_base64(msg) 
    msg.add_header('Content-Disposition', 'attachment', 
       filename=the_file + '.zip') 
    themsg.attach(msg) 
    themsg = themsg.as_string() 

    # send the message 
    smtp = smtplib.SMTP() 
    smtp.connect() 
    smtp.sendmail(sender, recipients, themsg) 
    smtp.close() 

Ho il sospetto che il problema è questo codice zip un file pure. Non voglio comprimere nulla perché ho già un file zippato che vorrei inviare. In entrambi i casi, questo codice è scarsamente documentato così come le librerie Python in quanto non forniscono informazioni su qualsiasi file img passato e di testo.

UPDATE: Errore sto ottenendo ora. Ho anche aggiornato ciò che è nel mio file con il codice sopra

Traceback (most recent call last): 
File "/Users/Zeroe/Documents/python_hw/cgi-bin/zip_it.py", line 100, in <module> 
send_file_zipped('hw5.zip', '[email protected]') 
File "/Users/Zeroe/Documents/python_hw/cgi-bin/zip_it.py", line 32, in send_file_zipped 
msg.set_payload(myzip.read()) 
TypeError: read() takes at least 2 arguments (1 given) 
+4

* Che codice * non funziona in * che * modo? – Cameron

+0

Questo è ... il secondo esempio di codice nella documentazione per il modulo 'email'. Dovrai fornire alcune specifiche per ottenere una risposta che non sarà essenzialmente una copia di quel campione. – millimoose

+0

Non è una copia ... Sto chiedendo loro di spiegare effettivamente come fa quello che mi serve attraverso un file zip. Ma posterò lo stesso codice a cui tutti si riferiscono costantemente ma non spiega ... – Andy

risposta

8

Non vedo davvero il problema. Basta omettere la parte che crea il file zip e, invece, basta caricare il file zip che hai.

In sostanza, questa parte qui

msg = MIMEBase('application', 'zip') 
msg.set_payload(zf.read()) 
encoders.encode_base64(msg) 
msg.add_header('Content-Disposition', 'attachment', 
       filename=the_file + '.zip') 
themsg.attach(msg) 

crea l'allegato. I

msg.set_payload(zf.read()) 

set, beh, il payload del attaccamento a ciò che si legge dal file zf (probabilmente significa file zip).

Basta aprire il file zip in precedenza e lasciare che questa linea legga da esso.

+0

Lo sto facendo ma dice che set_payload() prende 2 argomenti e questo è solo uno. – Andy

+0

@Andy: i documenti indicano che il secondo argomento, * set di caratteri *, è facoltativo. – martineau

+0

Ti mostrerò l'errore che sto ricevendo e il codice aggiornato come mi hai detto di fare probabilmente. Apprezzo l'aiuto. – Andy

0

Accetto che il pacchetto email non sia ancora ben documentato. L'ho studiato prima e ho scritto un modulo wrapper che semplifica questo tipo di attività. Ad esempio, i seguenti lavori:

from pycopia import ezmail 

# Get the data 
data = open("/usr/lib64/python2.7/test/zipdir.zip").read() 

# Make a proper mime message object. 
zipattachement = ezmail.MIMEApplication.MIMEApplication(data, "zip", 
     filename="zipdir.zip") 

# send it. 
ezmail.ezmail(["Here is the zip file.", zipattachement], 
     To="[email protected]", From="[email protected]", subject="zip send test") 

E questo è tutto ciò che serve una volta installato e configurato tutto. :-)

+2

Dato che l'OP non ha il tuo modulo wrapper, dubito che questa risposta sarà molto utile per loro ... – martineau

+0

@martineau È open source, quindi può essere facilmente ottenuto. – Keith

+0

Oh ... non sono sicuro di come lo si saprebbe, almeno dalla tua risposta. – martineau

Problemi correlati