2012-05-06 15 views
7

मैंने कई ट्यूटोरियल्स के साथ-साथ स्टैक ओवरफ़्लो पर अन्य प्रश्नों को देखा है, और दस्तावेज़ीकरण और स्पष्टीकरण न्यूनतम, केवल अस्पष्ट कोड हैं। मैं एक फाइल भेजना चाहता हूं जिसे मैंने पहले से ही ज़िप किया है, और इसे एक अनुलग्नक के रूप में भेजना है। मैंने दिए गए कोड की प्रतिलिपि बनाने और चिपकाने का प्रयास किया है, लेकिन यह काम नहीं कर रहा है, इसलिए मैं समस्या को ठीक नहीं कर सकता।पायथन में अनुलग्नक के रूप में ज़िप फ़ाइल कैसे भेजें?

तो मैं जो पूछ रहा हूं वह यह है कि अगर कोई यह बताता है कि smtplib के साथ-साथ ईमेल और एमआईएम पुस्तकालय एक फ़ाइल भेजने के लिए मिलकर काम करते हैं, तो विशेष रूप से, इसे ज़िप फ़ाइल के साथ कैसे करें। किसी भी सहायता की सराहना की जाएगी।

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

मुझे लगता है इस मुद्दे को इस कोड के साथ-साथ एक फ़ाइल से ज़िप है:

इस कोड है कि हर किसी के लिए संदर्भित करता है। मैं कुछ भी ज़िप नहीं करना चाहता क्योंकि मेरे पास पहले से ही एक ज़िप फ़ाइल है जिसे मैं भेजना चाहता हूं। किसी भी मामले में, यह कोड खराब रूप से दस्तावेज के साथ-साथ पाइथन पुस्तकालयों को भी दस्तावेज करता है क्योंकि वे पिछले आईएमजी फ़ाइल और टेक्स्ट फ़ाइलों पर किसी भी अंतर्दृष्टि प्रदान नहीं करते हैं।

अद्यतन: त्रुटि अब मैं प्राप्त कर रहा हूं। मैंने यह भी अपडेट किया है कि

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

इसकी प्रतिलिपि नहीं है ... मैं उनसे वास्तव में यह बताने के लिए कह रहा हूं कि यह एक ज़िप फ़ाइल के माध्यम से मुझे क्या चाहिए। लेकिन मैं वही कोड पोस्ट करूंगा जो हर कोई लगातार संदर्भित करता है लेकिन समझाता नहीं है ... – Andy

उत्तर

8

से ऊपर कोड के साथ मेरी फ़ाइल में क्या है, मुझे वास्तव में समस्या दिखाई नहीं दे रही है। बस उस भाग को छोड़ दें जो ज़िप फ़ाइल बनाता है और इसके बजाए, बस आपके पास ज़िप फ़ाइल लोड करें।

अनिवार्य रूप से, इस भाग यहाँ

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 से पढ़ने के लिए कुर्की की पेलोड (शायद ज़िप फ़ाइल अर्थ)।

बस अपनी ज़िप फ़ाइल को पहले से खोलें और इस लाइन को इससे पढ़ने दें।

+0

मैं ऐसा कर रहा हूं लेकिन यह कहता है कि set_payload() में 2 तर्क होते हैं और यह केवल एक है। – Andy

+0

@ एंडी: दस्तावेज़ दूसरे तर्क को इंगित करते हैं, * वर्णमाला *, वैकल्पिक है। – 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

चूंकि ओपी में आपका रैपर मॉड्यूल नहीं है, मुझे संदेह है कि यह उत्तर उनके लिए बहुत उपयोगी होगा ... – martineau

+0

@martineau यह खुला स्रोत है, इसलिए इसे आसानी से प्राप्त किया जा सकता है। – Keith

+0

ओह ... सुनिश्चित नहीं है कि कोई कैसे जानता होगा कि कम से कम आपके उत्तर से अकेले ही। – martineau

संबंधित मुद्दे