python 邮件脚本 - 添加 zip

问题描述 投票:0回答:3

我想寻求建议,以将 zip 选项添加到我用于发送报告的邮件脚本中。

我将电子邮件附件限制设置为 25MB,因此邮件程序脚本会删除一些超过 25MB 的 json 格式的报告。我想添加一个 zip 支持,如果附件比之前的大,它将压缩附件。 15MB。

以下代码仅是邮件部分。

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email.utils import COMMASPACE
import sys
from os.path import basename
import argparse
import conf
import os
import zipfile
import zlib

###############################################################################
# Mailer function for server running environment

def send_mail(recipients, cc=None, subject=None, attachment=None, body=None, send_from=None): 
    msg = MIMEMultipart()
    msg['Subject'] = subject
    msg['From'] = send_from
    msg['To'] = ','.join(recipients)
    if cc:
        msg['CC'] = ','.join(cc)
        recipients.extend(cc)
    if body:
        text = MIMEText(body, 'html')
        msg.attach(text)
    if attachment:
        with open(attachment, 'rb') as fp:
            att = MIMEApplication(fp.read(), Name=basename(attachment))
        att['Content-Disposition'] = f'attachment; filename="{basename(attachment)}"'
        msg.attach(att)

    smtp = smtplib.SMTP(conf.RELAY)
    smtp.sendmail(send_from, recipients, msg.as_string())
    smtp.quit()

python zip smtplib
3个回答
0
投票

假设您已经拥有的代码正确附加了任意附件,包括二进制附件,那么以下内容应该会压缩一个> 15M的附件。例如,如果原始文件的基本名称为 test.dat,则附件存档名称将为 test.dat.zip,并将包含 test.dat 作为隐式使用

zlib
的单个压缩文件。由于使用了内存缓冲区,因此不需要临时文件。因此,如果附件不是特别大,这应该非常有效:

    if attachment:
        MAX_ATTACHMENT_SIZE = 15 * 1024 * 1024
        with open(attachment, 'rb') as fp:
            bytes = fp.read()
        attachment_name = basename(attachment)
        if len(bytes) > MAX_ATTACHMENT_SIZE:
            from io import BytesIO
            buffer = BytesIO()
            with zipfile.ZipFile(buffer, 'w', compression=zipfile.ZIP_DEFLATED) as zip_file:
                zip_file.writestr(attachment_name, bytes)
            # New attachment name and new data:
            attachment_name += '.zip'
            bytes = buffer.getvalue()            
        att = MIMEApplication(bytes, Name=attachment_name)
        att['Content-Disposition'] = f'attachment; filename="{attachment_name}"'
        msg.attach(att)

0
投票

如果你想压缩附件,可以使用zipfile模块来压缩文件。

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 

...
if attachment:
    zf = tempfile.TemporaryFile(prefix='mail', suffix='.zip')
    zip = zipfile.ZipFile(zf, 'w')
    zip.write(attachment)
    zip.close()
    zf.seek(0)
    att = MIMEBase('application', 'zip')
    att.set_payload(zf.read())
    encoders.encode_base64(att)
    att.add_header('Content-Disposition', 'attachment', filename=the_file + '.zip')
    msg.attach(att)
...

0
投票

谢谢@Booboo。回答得很直接。

© www.soinside.com 2019 - 2024. All rights reserved.