You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从加密/签名邮件中下载Excel附件?(附PFX证书处理示例)

嘿,看你已经在处理加密签名邮件的事儿上有了起步,结合你提到的带密码PFX文件(含解密私钥和发件人公钥证书),还有给出的代码片段,我整理了一套更完整的实现方案,帮你顺利提取里面的Excel附件:

实现思路与完整代码示例

我假设你用的是MimeKit(毕竟你提到了jstedfast,这可是他维护的顶级邮件处理库),下面是可运行的最简完整代码:

using System;
using System.IO;
using MimeKit;
using MimeKit.Cryptography;
using System.Security.Cryptography.X509Certificates;

class Program
{
    static void Main(string[] args)
    {
        // 配置参数
        string privateKeyFullFileName = "你的PFX文件路径.pfx";
        string privateKeyPassword = "你的PFX密码";
        string encryptedEmailPath = "加密签名的邮件文件.eml";
        string outputFolder = "附件保存目录";

        // 1. 加载PFX证书(包含私钥和发件人公钥证书)
        var certificate = new X509Certificate2(
            privateKeyFullFileName, 
            privateKeyPassword,
            // 这里的Flags根据你的运行环境调整,避免权限或加载失败问题
            X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet
        );

        // 2. 创建加密上下文,用于解密邮件
        using (var ctx = new WindowsSecureMimeContext())
        {
            // 将证书导入上下文
            ctx.Import(certificate);

            // 3. 加载加密签名的邮件
            var message = MimeMessage.Load(encryptedEmailPath);

            // 4. 解密邮件内容
            var decryptedMessage = message.Decrypt(ctx);

            // 5. 验证邮件签名(可选但推荐,确保邮件未被篡改)
            if (decryptedMessage.IsSigned)
            {
                var signature = decryptedMessage.VerifySignature(ctx);
                if (signature.Verified)
                {
                    Console.WriteLine("邮件签名验证通过!");
                }
                else
                {
                    Console.WriteLine("邮件签名验证失败,可能已被篡改!");
                }
            }

            // 6. 遍历并提取Excel附件
            foreach (var attachment in decryptedMessage.Attachments)
            {
                // 判断是否为Excel文件(根据扩展名筛选)
                if (attachment.FileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase) || 
                    attachment.FileName.EndsWith(".xls", StringComparison.OrdinalIgnoreCase))
                {
                    // 创建保存目录(如果不存在)
                    Directory.CreateDirectory(outputFolder);
                    var savePath = Path.Combine(outputFolder, attachment.FileName);

                    // 保存附件到本地
                    using (var stream = File.Create(savePath))
                    {
                        attachment.Content.DecodeTo(stream);
                    }
                    Console.WriteLine($"Excel附件已保存到:{savePath}");
                }
            }
        }
    }
}
关键注意事项
  • NuGet包依赖:记得先安装MimeKitMailKit这两个NuGet包,它们是处理加密/签名邮件的核心工具。
  • 证书加载FlagsX509KeyStorageFlags的参数可能需要根据你的运行环境(比如Windows服务、桌面应用)调整,避免出现“密钥集不存在”之类的错误。
  • 签名验证:如果PFX里没有包含完整的证书链(比如根证书),签名验证可能失败,这时你需要把根证书导入到系统证书存储,或者在代码中手动添加根证书到上下文。
  • 邮件格式:确保你加载的邮件是标准的.eml格式,如果是从Outlook导出的.msg,可能需要额外处理(可以用MailKit的MsgReader库)。

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

火山引擎 最新活动