【发布时间】:2021-07-28 09:32:41
【问题描述】:
我需要每天发送一封电子邮件,其中包含必须受密码保护的 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 文件并且受密码保护)。
【问题讨论】:
-
你能在你的文件系统中看到文件
secure.zip,在与Python脚本相同的目录中吗?它是否被压缩和保护? -
如果您检查了
content实际上包含压缩数据,并且name实际上包含压缩文件名,那么您的客户端(我猜是 Outlook)可能会自动解压缩附件。最后,您可能需要将附件上的content_type属性设置为与压缩文件相关的内容。 -
secure.zip在我的文件系统中并受到保护。 -
我不认为打开 zip 存档的方式与我在这里所做的方式相同。如果我使用
zip_archive_content并使用open('new_archive.zip', 'rb') as f然后f.write(zip_archive_content)在我的脚本中重新保存,我发现'new_archive.zip' 文件实际上是一个excel 文件,我可以用.xlsx扩展名重命名它直接在 Excel 中打开。
标签: python encryption zip exchangelib