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

使用Exchange Web Service读取邮件附件乱码,如何解码为可读文本?

解决EWS读取邮件附件乱码问题

问题根源

你遇到的乱码是因为附件本身是二进制文件(如DOC、PDF、图片等),或是非UTF-8编码的文本文件。直接用Encoding.UTF8.GetString解析二进制字节数组,会因为字节结构不符合UTF-8编码规则,导致无法解码为可读文本。

分场景解决方案

场景1:附件是文本文件(TXT、CSV等)

文本文件可能使用GB2312、GBK、UTF-16等编码,而非默认的UTF-8。你可以尝试多种常见编码测试,或通过字节顺序标记(BOM)判断编码:

if (attachment is FileAttachment fileAttachment)
{
    fileAttachment.Load();
    byte[] buffer = fileAttachment.Content;

    // 尝试多种编码解码
    string[] candidateEncodings = { "utf-8", "gb2312", "gbk", "utf-16" };
    foreach (string encName in candidateEncodings)
    {
        try
        {
            string content = Encoding.GetEncoding(encName).GetString(buffer);
            Console.WriteLine($"【编码 {encName} 解码结果】\n{content}\n");
        }
        catch (ArgumentException)
        {
            Console.WriteLine($"编码 {encName} 不支持,跳过");
        }
    }
}

场景2:附件是二进制文件(DOC、PDF、图片等)

这类文件本身不是纯文本,无法直接解码为字符串。正确做法是将字节流保存为本地文件,用对应应用程序打开:

if (attachment is FileAttachment fileAttachment)
{
    fileAttachment.Load();
    // 指定保存路径,这里以桌面为例
    string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), fileAttachment.Name);
    File.WriteAllBytes(savePath, fileAttachment.Content);
    Console.WriteLine($"附件已保存至:{savePath},请用对应程序打开查看");
}

额外说明:Office文档(如DOCX)

如果是DOCX等Office开放格式文档,它本质是压缩包,内部包含XML文本。若要直接读取文本内容,需使用专门的库(如OpenXML SDK、NPOI)解析,示例(OpenXML SDK读取DOCX文本):

// 需先安装DocumentFormat.OpenXml NuGet包
using (MemoryStream ms = new MemoryStream(fileAttachment.Content))
using (WordprocessingDocument doc = WordprocessingDocument.Open(ms, false))
{
    string text = doc.MainDocumentPart.Document.Body.InnerText;
    Console.WriteLine("DOCX文本内容:\n" + text);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:15:04