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

使用Graph API添加大附件时遇413错误及序列化问题求助

解决Graph API添加大附件的413和序列化错误问题

我来帮你梳理下正确的操作流程,你遇到的问题主要是步骤顺序有误,加上端点版本使用不当导致的:


一、核心问题拆解

  1. 413错误原因:直接在创建邮件时附带7MB附件,超过了Graph API v1.0创建邮件接口的4MB请求大小限制,大附件必须用分块上传的方式处理。
  2. 序列化错误原因:v1.0的/attachments端点不支持直接添加大附件,这类操作必须通过beta版本的createUploadSession接口创建上传会话,再分块上传。你之前用v1.0端点尝试添加大附件,自然会出现解析失败的问题。

二、正确操作流程(C#示例)

1. 创建无附件的草稿邮件

先创建一个不带附件的草稿邮件,拿到唯一的messageId:

var graphClient = new GraphServiceClient(authProvider);

var draftMessage = new Message
{
    Subject = "邮件主题:带大附件的测试邮件",
    Body = new ItemBody
    {
        ContentType = BodyType.Html,
        Content = "您好,这是您需要的大文件。"
    },
    ToRecipients = new List<Recipient>
    {
        new Recipient
        {
            EmailAddress = new EmailAddress
            {
                Address = "收件人邮箱@example.com"
            }
        }
    }
};

var createdDraft = await graphClient.Me.Messages
    .Request()
    .AddAsync(draftMessage);
var messageId = createdDraft.Id;

2. 创建上传会话(必须用beta版本)

调用beta版本接口创建上传会话,获取专属的上传地址:

var uploadSessionBody = new CreateUploadSessionPostRequestBody
{
    AttachmentItem = new AttachmentItem
    {
        AttachmentType = AttachmentType.File,
        Name = "你的大文件名.pdf",
        Size = 7340032 // 填写文件实际字节数,7MB左右的数值
    }
};

var uploadSession = await graphClient.Me.Messages[messageId].Attachments
    .CreateUploadSession()
    .Request()
    .AddAsync(uploadSessionBody);
var uploadUrl = uploadSession.UploadUrl;

3. 分块上传附件

用拿到的uploadUrl进行分块上传,Graph API推荐块大小为5MB(可调整,但不要超过60MB):

using var fileStream = new FileStream(@"本地文件路径\你的大文件名.pdf", FileMode.Open);
var maxChunkSize = 5 * 1024 * 1024; // 5MB分块
var uploadTask = new LargeFileUploadTask<FileAttachment>(uploadSession, fileStream, maxChunkSize);

// 可选:添加上传进度回调
uploadTask.UploadProgressChanged += (sender, args) =>
{
    Console.WriteLine($"已上传:{args.BytesUploaded}/{args.TotalBytes} 字节");
};

// 执行上传
var uploadResult = await uploadTask.UploadAsync();

if (uploadResult.UploadSucceeded)
{
    Console.WriteLine("大附件上传成功!");
}
else
{
    Console.WriteLine($"上传失败:{uploadResult.Error.Message}");
}

4. 发送邮件

最后用v1.0接口发送带附件的草稿邮件:

await graphClient.Me.Messages[messageId]
    .Send()
    .Request()
    .PostAsync();

三、Postman测试步骤

如果用Postman复现,按以下步骤操作:

  1. 创建草稿邮件:

    • 请求方法:POST
    • URL:https://graph.microsoft.com/v1.0/me/messages
    • 请求体(JSON):
      {
        "subject": "测试大附件邮件",
        "body": {
          "contentType": "HTML",
          "content": "测试内容"
        },
        "toRecipients": [
          {
            "emailAddress": {
              "address": "收件人邮箱@example.com"
            }
          }
        ]
      }
      
    • 从响应中提取id作为messageId。
  2. 创建上传会话:

    • 请求方法:POST
    • URL:https://graph.microsoft.com/beta/me/messages/{messageId}/attachments/createUploadSession
    • 请求体(JSON):
      {
        "attachmentItem": {
          "attachmentType": "file",
          "name": "大文件名.pdf",
          "size": 7340032
        }
      }
      
    • 提取响应中的uploadUrl。
  3. 分块上传:

    • 用PUT请求调用uploadUrl,设置请求头Content-Range: bytes 0-5242879/7340032(根据块大小调整范围),请求体为对应块的文件内容。
    • 若文件大于5MB,需多次发送PUT请求,每次更新Content-Range的范围,直到全部上传完成。
  4. 发送邮件:

    • 请求方法:POST
    • URL:https://graph.microsoft.com/v1.0/me/messages/{messageId}/send

四、关键注意事项

  • 必须使用beta版本的createUploadSession接口,v1.0不支持该端点。
  • 上传会话创建后需在24小时内完成上传,否则会话会过期失效。
  • 分块上传时,Content-Range格式必须严格遵循bytes start-end/totalSize规则,start从0开始,end为当前块最后一个字节的索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 13:57:40