通过 exchangelib 发送受密码保护的文件

问题描述

我需要每天发送一封电子邮件,其中包含必须受密码保护的 Excel 文件。到目前为止,我一直在使用 exchangelib 来满足我的电子邮件需求。如果可能,我不想切换/添加不同的库。

发送带有附件的电子邮件不是问题,只需弄清楚如何使用密码保护和发送即可。我以为我已经接近这个解决方案,压缩并作为 zip 文件发送,但似乎无法附加 zip 存档,只是内容

from exchangelib import Message,Account,FileAttachment
from pyminizip import compress

m = Message(
    account=Account(...),subject="Some Subject",to_recipients=['somebody@theiremail.com']
)

xl_file_path = 'temp.xlsx'
zip_archive = 'secure.zip'
password = 'HomerSimpson'

compress(
    xl_file_path,None,zip_archive,password,5
)

with open(zip_archive,'wb') as f:
    zip_archive_content = f.read()

m.attach(FileAttachment(
    name=zip_archive,content=zip_archive_content
))

m.send()

当这个被发送时,它实际上是发送原始的 excel 文件。为了向我证明这一点,当附件被下载并被赋予“.xlsx”扩展名而不是“.zip”时,它会立即打开。

我知道 openpyxl 库中有密码保护,但这是一种弱保护(不加密)。我的理解是 compress 函数实际上是在加密数据 - 这正是我想要的。

我希望我只是遗漏了一些关于将 zip 存档作为附件发送的简单内容,但会接受密码保护文件的其他替代方法,或者如果真的没有其他选择 - 切换到发送电子邮件的不同方法

想法?

编辑

我确实验证了 secure.zip 存档与此脚本位于同一目录中,并且在手动打开时可以正常工作(即它包含我的 Excel 文件并且受密码保护)。

解决方法

感谢 Erik 在评论中。在 content_type='application/zip' 中设置 FileAttachment 正是我所需要的。

m.attach(FileAttachment(
    name=name,content=content,content_type='application/zip',))