使用Graph API通过MIME内容创建Office 365草稿邮件,无法获取草稿ID
通过Graph API用MIME内容创建草稿并获取ID的正确方法
你当前做法的问题
手动修改HttpRequestMessage的思路可行,但缺了两个关键环节:
- 没设置正确的
Content-Type请求头——Graph API要求MIME内容的请求头必须是message/rfc822 - 发送请求后没解析响应体——新建草稿的ID就在响应的JSON数据里,不解析根本拿不到
正确实现方式
方式1:用Graph SDK原生方法(推荐)
没必要手动改请求,SDK本身就支持直接传入MIME内容创建草稿:
// 准备MIME内容,转成Base64格式 var mimeContentString = "你的MIME格式邮件内容"; var base64Mime = Convert.ToBase64String(Encoding.UTF8.GetBytes(mimeContentString)); // 调用SDK方法创建草稿 var draftMessage = await graphClient.Users[sendFrom].Messages .Request() .AddAsync(new Message { MimeContent = new MimeContent { Type = "message/rfc822", Content = base64Mime } }); // 直接获取草稿ID var draftId = draftMessage.Id;
方式2:手动处理HTTP请求(如果非要用这种方式)
如果坚持手动修改请求,必须补充请求头并解析响应:
var draftMessagesRequest = graphClient .Users[sendFrom] .Messages .Request() .GetHttpRequestMessage(); // 设置POST方法和正确的Content-Type头 draftMessagesRequest.Method = HttpMethod.Post; draftMessagesRequest.Content = content; draftMessagesRequest.Content.Headers.ContentType = new MediaTypeHeaderValue("message/rfc822"); var draftMessageResponse = await graphClient.HttpProvider.SendAsync(draftMessagesRequest); // 解析响应体拿到ID if (draftMessageResponse.IsSuccessStatusCode) { var responseJson = await draftMessageResponse.Content.ReadAsStringAsync(); var draftMessage = JsonConvert.DeserializeObject<Message>(responseJson); var draftId = draftMessage.Id; }
注意事项
- MIME内容必须符合RFC 822标准,格式错误会导致创建失败
- 权限需要申请
Mail.ReadWrite或Mail.Send,否则会返回权限不足的错误 - 响应JSON里的ID字段是小写的
id,用SDK的Message类反序列化时会自动映射到Id属性
内容的提问来源于stack exchange,提问作者Zarek
相关产品推荐
相关产品推荐

