如何用Python Exchangelib提取带SMIME签名邮件的附件信息
处理带数字签名的SMIME邮件附件获取问题
- 你看到的
smime.p7m是SMIME签名后的封装容器,原始邮件(含PDF附件)被打包在这个容器里,所以直接调用email.attachment只能看到这个封装文件。 - 按以下步骤提取原始附件信息:
- 获取SMIME容器内容
先拿到smime.p7m的字节内容:p7m_content = email.attachments[0].content - 解析SMIME签名数据
使用cryptography库解析PKCS#7格式的签名数据,仅签名的邮件无需私钥即可提取原始内容:from cryptography.hazmat.primitives.serialization import pkcs7 # 判断是PEM还是DER格式 if p7m_content.startswith(b'-----BEGIN'): signed_data = pkcs7.load_pem_pkcs7_certificates(p7m_content) else: signed_data = pkcs7.load_der_pkcs7_certificates(p7m_content) # 提取原始邮件字节流 original_email_bytes = signed_data.content - 重新解析原始邮件
将提取出的字节流转为标准邮件对象:from email import message_from_bytes original_email = message_from_bytes(original_email_bytes) - 遍历获取附件信息
现在可以像处理普通邮件一样遍历附件,获取文件名、类型、大小和内容:for part in original_email.walk(): if part.get_content_disposition() == 'attachment': # 附件名 filename = part.get_filename() # Content-Type content_type = part.get_content_type() # 附件大小(字节) size = len(part.get_payload(decode=True)) # 附件内容(字节流) content = part.get_payload(decode=True) # 打印或处理信息 print(f"文件名: {filename}, 类型: {content_type}, 大小: {size}字节")
- 获取SMIME容器内容
- 注意事项:
- 如果邮件是加密并签名的,必须使用对应的私钥解密后才能获取内容;仅签名的邮件无需私钥。
- 提前安装依赖:
pip install cryptography
内容的提问来源于stack exchange,提问作者exik
相关产品推荐
相关产品推荐

