如何使用Microsoft Graph SDK批量请求下载多封邮件并解决格式错误?
批量下载邮件的错误修正方案
问题原因
你遇到的Invalid batch payload format错误,核心原因是批量请求中的每个步骤未指定唯一ID,这是Microsoft Graph批量API的强制要求;另外直接操作request.Headers可能导致头信息未被正确注入批量请求。
修正后的代码
var batchRequestContent = new BatchRequestContent(); int requestCounter = 1; foreach (var emailId in emailIds) { // 使用SDK推荐的WithHeader方法设置Accept头 var request = graphServiceClient.Users[EmailAddress].Messages[emailId] .Request() .WithHeader("Accept", "message/rfc822"); // 为每个请求添加唯一ID,这是批量请求的必填项 batchRequestContent.AddBatchRequestStep(request, requestCounter.ToString()); requestCounter++; } var batchResult = await graphServiceClient.Batch.Request().PostAsync(batchRequestContent, cancellationToken); // 遍历处理每个邮件的响应 foreach (var entry in batchResult.BatchResponses) { var response = entry.Value; if (response.IsSuccessStatusCode) { // 读取RFC822格式的二进制邮件内容 byte[] emailContent = await response.Content.ReadAsByteArrayAsync(); // 可将byte数组保存为.eml文件或做其他处理 } else { // 处理请求失败的情况 string errorDetails = await response.Content.ReadAsStringAsync(); // 日志记录或错误处理逻辑 } }
关键注意事项
- 唯一ID要求:每个批量请求步骤必须分配唯一的字符串ID,否则Graph API会返回格式错误。
- 请求头设置:使用
.WithHeader()替代直接修改request.Headers,确保头信息被正确包含到批量请求的payload中。 - 响应处理:由于请求返回的是二进制的RFC822格式内容,需要用
ReadAsByteArrayAsync()读取,而非JSON解析。 - 批量上限:Microsoft Graph批量API单次最多支持20个请求,如果你的
emailIds数量超过20,需要拆分多个批量请求分批处理。
该需求完全可以实现,按上述代码调整后即可正常运行。
内容的提问来源于stack exchange,提问作者ilitirit
相关产品推荐
相关产品推荐

