You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python Exchangelib提取带SMIME签名邮件的附件信息

处理带数字签名的SMIME邮件附件获取问题
  • 你看到的smime.p7m是SMIME签名后的封装容器,原始邮件(含PDF附件)被打包在这个容器里,所以直接调用email.attachment只能看到这个封装文件。
  • 按以下步骤提取原始附件信息:
    1. 获取SMIME容器内容
      先拿到smime.p7m的字节内容:
      p7m_content = email.attachments[0].content
      
    2. 解析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
      
    3. 重新解析原始邮件
      将提取出的字节流转为标准邮件对象:
      from email import message_from_bytes
      
      original_email = message_from_bytes(original_email_bytes)
      
    4. 遍历获取附件信息
      现在可以像处理普通邮件一样遍历附件,获取文件名、类型、大小和内容:
      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}字节")
      
  • 注意事项:
    • 如果邮件是加密并签名的,必须使用对应的私钥解密后才能获取内容;仅签名的邮件无需私钥。
    • 提前安装依赖:pip install cryptography

内容的提问来源于stack exchange,提问作者exik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:25:28