问题描述
我需要每天发送一封电子邮件,其中包含必须受密码保护的 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',))