12

我浏览了许多教程,以及关于堆栈溢出的其他问题,文档和解释至少是无法解释的代码。我想发送一个我已经压缩的文件,并将其作为附件发送。我尝试复制和粘贴提供的代码,但它不起作用,因此我无法解决问题。

所以我要问的是,是否有人知道谁来解释 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='you@you.com'):
    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', 'avaldez@oswego.edu')
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

3 回答 3

12

我真的没有看到问题。只需省略创建 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 文件,然后从中读取此行。

于 2012-05-06T22:24:28.267 回答
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="me@mydomain.com", From="me@mydomain.com", subject="zip send test")

一旦您安装和配置了所有东西,这就是您所需要的。:-)

于 2012-05-06T22:56:59.023 回答
0

我的答案用于shutil压缩包含附件的目录,然后将其添加.zip到电子邮件中。

# Importing Dependencies
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

import smtplib
import shutil

def Send_Email():

    # Create a multipart message
    msg = MIMEMultipart()
    Body = MIMEText( {Enter Email Body as str here} )
    # Add Headers
    msg['Subject'] = ''
    msg['From'] = ''
    msg['To'] = ''
    msg['CC'] = ''
    msg['BCC'] = ''

    # Add body to email
    msg.attach(Body)
    
    # Using Shutil to Zip a Directory
    dir_name = {Add Path of the Directory to be Zipped}
    output_filename = {Add Output Zip File Path}
    shutil.make_archive(output_filename, 'zip', dir_name)

    part = MIMEBase("application", "octet-stream")
    part.set_payload(open(output_filename + ".zip", "rb").read())
    encoders.encode_base64(part)
    part.add_header("Content-Disposition", "attachment; filename=\"%s.zip\"" % (output_filename))
    msg.attach(part)
于 2021-08-09T12:22:50.930 回答