作为更大工作流程的一部分,我收到了一封电子邮件和密码,以及该证书的.pfx证书和密码。我需要使用这些来下载特定的电子邮件(特别是其附件(,以便在其他脚本中处理它。
我已经设法将.pfx文件转换为.pem文件。使用下面的代码,我可以下载消息:
import email
import imaplib
EMAIL = 'test@test.com'
PASSWORD = 'testpassword'
SERVER = "outlook.office365.com"
# Connect to the server and go to its inbox
mail = imaplib.IMAP4_SSL(SERVER, port=993)
mail.login(EMAIL, PASSWORD)
mail.select('inbox')
# Get the relevant mail ID
status, ids = mail.search(None, '(HEADER Subject "Testmessage_")')
mail_id = ids[0].split()[0]
# Fetch the mail, get the data, write the file
status, contents = mail.fetch(mail_id, '(RFC822)')
data = contents[0][1]
with open("outputfile.txt", "wb") as outputfile:
outputfile.write(data)
然后,我可以用OpenSSL用以下命令解码outputfile.txt:
openssl cms -decrypt -in outputfile.txt -inkey cert.pem > outputmessage.txt
我可以确认,在outputmessage.txt-file中,附件的内容是可见的,并且有一些变通方法,可以在我的Python脚本的其余部分中使用。
然而,这意味着要使用多个临时文件和(至少(三个不同的命令(再次使用python-openssl-python(。我想在Python中完成所有这些,这样我就不必创建临时文件,并且可以在下面的脚本中立即处理结果。此外,我更愿意使用尽可能少的外部依赖项。
我见过提到的M2Crypto和密码学,但我似乎无法在我的机器上运行这两个包(带轮子的东西?(。还有其他选择吗?
import subprocess
# ...
subprocess.run(['openssl', 'cms', '-decrypt',
'-inkey', 'cert.pem', '-out', 'outputmessage.txt'],
input=data, check=True)
我本地没有openssl cms
,但我从手册页推测,如果不传入-in
选项,它将读取标准输入。如果不是这样,可以尝试-in
、-
,或者用/dev/stdin
取代-
,或者您的平台提供的任何东西。