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

