2012-05-06 106 views
7

我已經瀏覽了很多教程,以及其他關於堆棧溢出的問題,並且文檔和解釋至少是原因不明的代碼。我想發送一個我已經壓縮的文件,並將其作爲附件發送。我已經嘗試複製並粘貼提供的代碼,但它不起作用,因此我無法解決問題。如何發送一個zip文件作爲python中的附件?

所以我問的是,如果有人知道誰來解釋smtplib以及電子郵件和MIME庫如何一起發送文件,更具體地說,如何用zip文件來完成。任何幫助,將不勝感激。

這是代碼,每個人都指的是:

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

我懷疑這個問題是這樣的代碼拉鍊一個文件中。我不想壓縮任何內容,因爲我已經有了一個我想發送的壓縮文件。無論哪種情況,這些代碼都沒有很好的文檔記錄以及python庫本身,因爲它們沒有提供任何有關img文件和文本文件過去的信息。

更新:錯誤我現在得到。我也更新了我的文件中的以上代碼

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

*什麼*代碼不工作*什麼*方式? – Cameron

+0

這是......電子郵件模塊文檔中的第二個代碼示例。您必須提供一些具體信息才能得到任何答案,而這些答案本質上並不是該樣本的副本。 – millimoose

+0

它不是副本......我要求他們真正解釋它是如何通過一個zip文件來完成我所需要的。但我會發布相同的代碼,大家經常提到但不解釋... – Andy

回答

8

我真的不知道問題所在。只是省略了創建zip文件的部分,而只是加載你所擁有的zip文件。

從本質上講,這裏

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) 

這部分產生的附件。該

msg.set_payload(zf.read()) 

套,好了,附件爲您從文件zf讀什麼有效載荷(大概意思zip文件)。

只需事先打開您的zip文件,並讓其從中讀取。

+0

我這樣做,但它說set_payload()需要2個參數,那只有一個。 – Andy

+0

@Andy:文檔指出第二個參數* charset *是可選的。 – martineau

+0

我會告訴你我得到的錯誤以及你告訴我可能會做的更新代碼。我很感激幫助。 – Andy

0

我同意電子郵件包還沒有很好的記錄。我之前調查過它,並編寫了一個簡化這些任務的包裝模塊。例如,以下工作:

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

而這一切你需要一旦你有一切安裝和配置。 :-)

+2

由於OP沒有你的包裝模塊,我懷疑這個答案對他們是非常有用的...... – martineau

+0

@martineau它是開源的,所以它可以很容易地獲得。 – Keith

+0

哦......不知道人們會怎麼知道,但至少從你自己的答案。 – martineau

相關問題