【问题标题】:Sending a password protected file over exchangelib通过 exchangelib 发送受密码保护的文件
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 2011-02-06
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多