如何通过Graph API获取收件人邮箱?代码问题求助
问题:无法从Graph API的Message对象中正确提取ToRecipients的邮箱地址
我使用Microsoft Graph SDK的C#代码获取邮件的toRecipients属性,但无法像访问sender或from那样通过GetToEmail.ToRecipients.EmailAddress.Address获取邮箱地址,代码如下:
var GetToEmail = await graphClient.Users[$"{_Email}"].MailFolders["Inbox"] .ChildFolders[$"{SubFolderId1}"] .ChildFolders[$"{SubFolderId2}"] .Messages[$"{MessageID}"] .Request() /*.Select(eml => new { eml.Id, eml.From, eml.ToRecipients })*/ .GetAsync(); foreach (var recipient in GetToEmail.ToRecipients) { WriteLogClass.WriteToLog(3, $"{recipient}"); }
通过Graph Explorer查看JSON响应,确认数据是正常返回的:
{ "sender": { "emailAddress": { "name": "CTDS Servicedesk", "address": "ctds.servicedesk@kghcustoms.com" } }, "from": { "emailAddress": { "name": "CTDS Servicedesk", "address": "ctds.servicedesk@kghcustoms.com" } }, "toRecipients": [ { "emailAddress": { "name": "Sandaruwan Samaraweera", "address": "sandaruwan.s@pro-account.lk" } } ], "ccRecipients": [], "bccRecipients": [], "replyTo": [], "flag": { "flagStatus": "notFlagged" } }
解决方案
核心问题是ToRecipients是集合类型(对应JSON中的数组),而sender/from是单个对象,因此不能直接通过集合访问EmailAddress属性,必须遍历集合中的每个Recipient对象。同时建议启用Select语句只请求需要的字段,提升请求性能。
修改后的代码示例:
var GetToEmail = await graphClient.Users[$"{_Email}"].MailFolders["Inbox"] .ChildFolders[$"{SubFolderId1}"] .ChildFolders[$"{SubFolderId2}"] .Messages[$"{MessageID}"] .Request() .Select(eml => new { eml.ToRecipients }) .GetAsync(); foreach (var recipient in GetToEmail.ToRecipients) { // 正确提取收件人邮箱地址和显示名 var email = recipient.EmailAddress.Address; var displayName = recipient.EmailAddress.Name; WriteLogClass.WriteToLog(3, $"收件人:{displayName} <{email}>"); }
说明
ToRecipients的类型是IList<Recipient>,集合本身没有EmailAddress属性,只有集合内的每个Recipient实例才有该属性,因此必须通过循环遍历每个元素来获取邮箱地址。- 启用
Select可以减少Graph API返回的数据量,避免加载不需要的邮件属性,提升请求效率。
内容的提问来源于stack exchange,提问作者S4NDM4N
相关产品推荐
相关产品推荐

