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

使用MailKit(IMAP)将邮件附件转为byte[]存入Azure存储

解决MailKit下载附件转byte[]并存储到Azure的问题

你遇到的核心问题是用MemoryStream转换附件为byte[]后文件损坏,大概率是流操作细节没处理到位,以下是修正后的完整方案:

修正后的代码

替换你原来的本地写入逻辑,直接生成可用的byte[]:

await client.Inbox.OpenAsync(FolderAccess.ReadOnly);
var items = await client.Inbox.FetchAsync(new List<UniqueId>() { new UniqueId(uid) }, MessageSummaryItems.UniqueId | MessageSummaryItems.BodyStructure);

foreach (var item in items)
{
    foreach (var attachment in item.Attachments)
    {
        var entity = await client.Inbox.GetBodyPartAsync(item.UniqueId, attachment);
        var fileName = attachment.ContentDisposition?.FileName ?? attachment.ContentType.Name;
        byte[] attachmentBytes = null;

        using (var stream = new MemoryStream())
        {
            if (entity is MessagePart messagePart)
            {
                // 处理嵌套邮件附件,完整写入流
                await messagePart.Message.WriteToAsync(stream);
            }
            else if (entity is MimePart mimePart)
            {
                // 处理普通附件,解码后写入流
                await mimePart.Content.DecodeToAsync(stream);
            }

            // 重置流位置到起始处(ToArray不依赖,但养成好习惯)
            stream.Position = 0;
            // 转换为byte数组
            attachmentBytes = stream.ToArray();
        }

        // ********** 这里对接Azure存储 **********
        // 示例:上传到Azure Blob存储
        // var blobClient = containerClient.GetBlobClient(fileName);
        // await blobClient.UploadAsync(new MemoryStream(attachmentBytes), overwrite: true);

        // 可选测试:写入本地验证文件完整性
        // File.WriteAllBytes(Path.Combine(@"C:\temp\mails", fileName), attachmentBytes);
    }
}

关键修正点

  1. 明确类型判断:用is模式匹配直接获取强类型对象,避免隐式转换出错
  2. 重置流位置:虽然MemoryStream.ToArray()会返回整个缓冲区的字节,不依赖当前位置,但重置位置是良好的流操作习惯,避免后续扩展逻辑时出错
  3. 确保异步操作完成:所有流写入操作都用await等待,避免流未写完就转换为byte[]

对接Azure存储示例

如果用Azure Blob存储,引入Azure.Storage.Blobs包后,可在拿到attachmentBytes后执行以下代码:

// 初始化客户端(提前配置好连接字符串和容器名)
var blobServiceClient = new BlobServiceClient("你的Azure存储连接字符串");
var containerClient = blobServiceClient.GetBlobContainerClient("你的容器名称");

// 上传byte数组到Blob
var blobClient = containerClient.GetBlobClient(fileName);
await blobClient.UploadAsync(new MemoryStream(attachmentBytes), overwrite: true);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:20:27