2012-05-06 37 views
7

Tôi đã xem qua nhiều hướng dẫn, cũng như các câu hỏi khác ở đây về tràn ngăn xếp và tài liệu và giải thích ở mức tối thiểu, chỉ là mã không giải thích được. Tôi muốn gửi một tệp mà tôi đã nén và gửi tệp dưới dạng tệp đính kèm. Tôi đã thử sao chép và dán mã được cung cấp, nhưng nó không hoạt động, do đó tôi không thể khắc phục vấn đề. Vì vậy, những gì tôi hỏi là nếu có ai biết giải thích làm thế nào smtplib cũng như thư viện email và MIME làm việc cùng nhau để gửi một tập tin, cụ thể hơn, làm thế nào để làm điều đó với một tập tin zip. Bất kỳ trợ giúp sẽ được đánh giá cao.Cách gửi tệp zip dưới dạng tệp đính kèm trong python?

Đây là mã mà mọi người đề cập đến:

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

tôi nghi ngờ vấn đề này là mã này kéo khóa một tập tin là tốt. Tôi không muốn nén bất kỳ thứ gì vì tôi đã có một tệp nén mà tôi muốn gửi. Trong cả hai trường hợp, mã này kém tài liệu cũng như các thư viện python khi chúng không cung cấp thông tin chi tiết về bất kỳ tệp img và tệp văn bản nào trong quá khứ.

CẬP NHẬT: Lỗi tôi đang nhận ngay bây giờ. Tôi cũng đã cập nhật những gì có trong tệp của mình với mã ở trên

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

* Mã * nào không hoạt động * cách nào? – Cameron

+0

Đây là ... mẫu mã thứ hai trong tài liệu cho mô-đun email '. Bạn sẽ phải đưa ra một số chi tiết cụ thể để có được bất kỳ câu trả lời nào về cơ bản sẽ không phải là bản sao của mẫu đó. – millimoose

+0

Nó không phải là một bản sao ... Tôi yêu cầu họ thực sự giải thích làm thế nào nó làm những gì tôi cần thông qua một tập tin zip. Nhưng tôi sẽ đăng cùng một mã mà mọi người liên tục đề cập đến nhưng không giải thích ... – Andy

Trả lời

8

Tôi thực sự không thấy vấn đề. Chỉ cần bỏ qua phần tạo tệp zip và thay vào đó, chỉ cần tải tệp zip mà bạn có.

Về cơ bản, phần này đây

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) 

tạo tập tin đính kèm.

msg.set_payload(zf.read()) 

đặt, tải trọng của tệp đính kèm vào nội dung bạn đọc từ tệp zf (có thể là tệp zip).

Chỉ cần mở tệp zip của bạn trước và để dòng này đọc từ đó.

+0

Tôi đang làm điều đó nhưng nó nói set_payload() có 2 đối số và thats chỉ có một. – Andy

+0

@Andy: Các tài liệu chỉ ra đối số thứ hai, * bộ ký tự *, là tùy chọn. – martineau

+0

Tôi sẽ cho bạn thấy lỗi tôi nhận được và mã cập nhật như bạn đã nói với tôi có thể làm. Tôi đánh giá cao sự giúp đỡ. – Andy

0

Tôi đồng ý rằng gói email chưa được ghi lại đầy đủ. Tôi đã nghiên cứu nó trước và viết một mô-đun trình bao bọc để đơn giản hóa các loại nhiệm vụ này. Ví dụ: các công trình sau:

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

Và đó là tất cả những gì bạn cần khi bạn đã cài đặt và định cấu hình mọi thứ. :-)

+2

Vì OP không có mô-đun bao bọc của bạn, tôi nghi ngờ câu trả lời này sẽ rất hữu ích cho họ ... – martineau

+0

@martineau Đó là mã nguồn mở, vì vậy nó có thể dễ dàng có được. – Keith

+0

Oh ... không chắc chắn làm thế nào người ta sẽ biết rằng mặc dù, ít nhất là từ câu trả lời của bạn một mình. – martineau

Các vấn đề liên quan