如何通过Microsoft Graph SDK获取邮件的文本与HTML内容
解决方案:单次请求获取邮件的Text和HTML正文
问题核心
需要在Microsoft Graph中单次请求同时获取邮件的text/plain和html格式正文,避免发起两次请求的冗余操作。
纠正错误代码
ChatGPT提供的代码不符合Microsoft Graph API的实际结构:Message.Body是单个ItemBody对象,而非集合,因此无法遍历message.Body.Content。
正确实现方式
通过设置Prefer请求头为outlook.body-content-type='text; html',可在单次请求中同时获取两种格式的正文内容,Graph API会在响应中返回TextBody和HtmlBody两个属性。
以下是完整的初始化与请求代码示例(以C# Graph SDK为例):
// 初始化Graph客户端(委托权限模式,交互式认证) var scopes = new[] { "Mail.Read" }; var clientId = "你的客户端ID"; var tenantId = "你的租户ID"; var credentialOptions = new InteractiveBrowserCredentialOptions { ClientId = clientId, TenantId = tenantId, RedirectUri = new Uri("http://localhost"), }; var credential = new InteractiveBrowserCredential(credentialOptions); var graphClient = new GraphServiceClient(credential, scopes); // 构建请求,添加Prefer头并指定返回字段 var requestHeaders = new Dictionary<string, string> { { "Prefer", "outlook.body-content-type='text; html'" } }; var targetMessage = await graphClient.Me.Messages["目标邮件ID"] .Request(requestHeaders) .Select(msg => new { msg.Id, msg.Subject, msg.TextBody, msg.HtmlBody }) .GetAsync(); // 提取正文内容 var plainTextContent = targetMessage.TextBody?.Content; var htmlContent = targetMessage.HtmlBody?.Content;
关键说明
- 权限配置:确保你的应用已申请
Mail.Read权限(委托或应用权限均可,根据场景选择) - 请求头作用:
Prefer头告知Graph API同时返回两种格式的正文,无需拆分两次请求 - 字段选择:使用
Select方法指定仅返回需要的字段,减少响应体积
替代方案(直接调用REST API)
如果不使用SDK,可直接发送HTTP请求:
GET https://graph.microsoft.com/v1.0/me/messages/{message-id}?$select=id,subject,textBody,htmlBody Prefer: outlook.body-content-type='text; html'
内容的提问来源于stack exchange,提问作者Mighty
相关产品推荐
相关产品推荐

