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

使用ImapX读取邮件无法同时识别普通附件与嵌入附件问题求助

ImapX邮件附件读取问题修复方案

核心问题排查

    1. 分支逻辑错误:当前代码用if-else判断普通附件和嵌入资源,若邮件同时包含两类附件,只会进入普通附件的处理分支,嵌入资源永远不会被处理,这是混合附件场景读取不全的核心原因。
    1. 变量覆盖问题:ArchivosAdjuntosFiltrados变量在每次遍历邮件时都会被新的查询结果覆盖,最终遍历保存附件时只能拿到最后一封符合条件的邮件的附件,之前的所有附件都会丢失。
    1. 语法错误:普通附件的筛选条件中缺少||运算符,代码无法正常编译运行。
    1. 嵌入资源处理逻辑异常:嵌入资源的筛选代码被注释,且筛选时没有把文件名转小写,大写后缀的PDF/XML文件会匹配失败。
    1. 文件写入逻辑错误:当前逻辑只有当目标路径已存在同名文件时才会触发写入,新文件永远不会被保存。

修正后代码

{
    string strFiltro = String.Format("SINCE {0}-{1}-{2} BEFORE {3}-{4}-{5} {6} ",
                                    strDiaInicial,
                                    strMesInicial,
                                    strAnioInicial,
                                    strDiaFinal,
                                    strMesFinal,
                                    strAnioFinal,
                                    this.MensajesNoLeidos ? "UNSEEN" : "ALL");
    IEnumerable<Message> mensajesFiltrados = folder.Search(strFiltro);
    mensajesFiltrados = mensajesFiltrados.Where(x => x.Attachments.Count() > 0 || x.EmbeddedResources.Count() > 0);

    // 初始化列表存储所有符合条件的附件,避免变量覆盖
    List<Attachment> ArchivosAdjuntosFiltrados = new List<Attachment>();

    foreach (Message message in mensajesFiltrados)
    {
        // 拆分if-else为两个独立判断,同时处理两类附件
        if (message.Attachments.Count() > 0)
        {
            var validAttachments = message.Attachments.Where(x => 
                x.ContentType.Name.ToLower().Contains(".pdf") 
                || x.ContentType.Name.ToLower().Contains(".xml"));
            ArchivosAdjuntosFiltrados.AddRange(validAttachments);
            resultado[0] += validAttachments.Count();
        }

        if (message.EmbeddedResources.Count() > 0)
        {
            var validEmbedded = message.EmbeddedResources.Where(x => 
                x.ContentType.Name.ToLower().Contains(".pdf") 
                || x.ContentType.Name.ToLower().Contains(".xml"));
            ArchivosAdjuntosFiltrados.AddRange(validEmbedded);
            resultado[0] += validEmbedded.Count();
        }
    }

    foreach (Attachment atachemtn in ArchivosAdjuntosFiltrados)
    {
        strNombreArchivo = atachemtn.FileName;
        if (string.IsNullOrEmpty(strNombreArchivo))
            continue;
        
        String attachData = atachemtn.GetTextData().Replace('-', '+').Replace('_', '/');
        if (intPosicion > 0)
        {
            attachData = attachData.Substring(0, attachData.Length - 31);
        }

        string savePath = Path.Combine(strRutaDescargas, strNombreArchivo);
        // 修正文件写入逻辑:不存在直接写,存在则判断是否覆盖
        if (!File.Exists(savePath) || pBlnSobreescribirArchivos)
        {
            byte[] data = Convert.FromBase64String(attachData);
            File.WriteAllBytes(savePath, data);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 21:36:11