2012-05-06 19 views
7

Przeszukałem wiele samouczków, a także inne pytania dotyczące przepełnienia stosu, a dokumentacja i wyjaśnienie są ograniczone do minimum, a kod jest niewytłumaczalny. Chciałbym wysłać plik, który już skompresowałem i wysłać jako załącznik. Próbowałem skopiować i wkleić podany kod, ale nie działa, dlatego nie mogę naprawić problemu.Jak wysłać plik zip jako załącznik w pythonie?

To, o co pytam, to czy ktoś wie, kto wyjaśnia, w jaki sposób smtplib, a także e-maile i biblioteki MIME współpracują ze sobą, aby wysłać plik, a dokładniej, jak to zrobić z plikiem zip. Każda pomoc będzie doceniona.

Jest to kod, który każdy odnosi się do:

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() 

Podejrzewam, że problem jest ten kod zamki plik jako dobrze. Nie chcę niczego spakować, ponieważ mam już spakowany plik, który chciałbym wysłać. W obu przypadkach kod ten jest słabo udokumentowany, a także same biblioteki Pythona, ponieważ nie zapewniają wglądu w nic poza plikami img i tekstowymi.

AKTUALIZACJA: Błąd pojawia się teraz. Zaktualizowałem także zawartość mojego pliku pod kodem powyżej:

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

* Jaki * kod nie działa w * jaki * sposób? – Cameron

+0

To jest ... drugi przykład kodu w dokumentacji modułu 'email'. Będziesz musiał podać kilka szczegółów, aby uzyskać jakąkolwiek odpowiedź, która nie będzie w zasadzie kopią tego przykładu. – millimoose

+0

To nie jest kopia ... Proszę, aby wyjaśnił, jak robi to, czego potrzebuję, poprzez plik zip. Ale opublikuję ten sam kod, do którego wszyscy nieustannie się odwołują, ale nie wyjaśnia ... – Andy

Odpowiedz

8

Naprawdę nie widzę problemu. Po prostu pomiń część, która tworzy plik zip, a zamiast tego po prostu wczytaj plik zip.

Zasadniczo, ta część tutaj

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) 

tworzy załącznik. W

msg.set_payload(zf.read()) 

zestawy, dobrze, ładowność od przywiązania do tego, co można przeczytać w pliku zf (prawdopodobnie oznacza plik zip).

Po prostu otwórz plik zip i pozwól, aby ten wiersz został odczytany.

+0

Robię to, ale mówi, że set_payload() ma 2 argumenty i to tylko jeden. – Andy

+0

@Andy: Dokumenty wskazują, że drugi argument, * charset *, jest opcjonalny. – martineau

+0

Pokażę ci błąd, który otrzymuję, i zaktualizowany kod, tak jak mi kazałeś. Doceniam pomoc. – Andy

0

Zgadzam się, że pakiet e-mailowy nie jest jeszcze dobrze udokumentowany. Zbadałem go wcześniej i napisałem moduł opakowania, który upraszcza tego typu zadania. Na przykład następujące prace:

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") 

I to wszystko, czego potrzebujesz, gdy wszystko jest zainstalowane i skonfigurowane. :-)

+2

Ponieważ OP nie ma twojego modułu opakowania, wątpię, aby ta odpowiedź była dla nich bardzo przydatna ... – martineau

+0

@martineau Jest to open source, więc można go łatwo uzyskać. – Keith

+0

Oh ... nie jestem pewien, jak by się o tym dowiedział, przynajmniej z samej odpowiedzi. – martineau

Powiązane problemy