如何修改EWS代码向Microsoft Unified Group添加邮件?
向Microsoft 365 Unified Group写入邮件的解决方案
EWS实现的可行调整方案
你遇到的“Only one access mode header may be specified”错误,本质是EWS不允许同时设置多个身份模拟头(Exchange Impersonation/ConnectingSID)。针对Unified Group的邮件写入需求,无需同时模拟普通用户和组邮箱,正确调整方式如下:
- 权限配置:
- 个人OAuth账号:确保该用户是目标Unified Group的成员(默认组成员具备访问组邮箱的权限)。
- 服务账号:需为账号申请EWS的
FullAccess应用权限,或针对目标组邮箱的特定访问权限。
- SOAP请求调整:
移除多余的Exchange Impersonation头,直接在CreateItem请求中指定目标组邮箱的SMTP地址作为操作对象。核心SOAP片段示例:
注意:OAuth Token需包含对该组邮箱的访问权限,服务账号场景下需确保Token的权限范围覆盖EWS及目标组。<CreateItem MessageDisposition="SaveOnly"> <Items> <Message> <Subject>测试组邮件</Subject> <Body BodyType="HTML">这是发送到Unified Group的测试邮件</Body> <ToRecipients> <Mailbox> <EmailAddress>group-smpt@contoso.com</EmailAddress> </Mailbox> </ToRecipients> </Message> </Items> <SavedItemFolderId> <DistinguishedFolderId Id="inbox"> <Mailbox> <EmailAddress>group-smpt@contoso.com</EmailAddress> </Mailbox> </DistinguishedFolderId> </SavedItemFolderId> </CreateItem>
改用Graph API的优势与实现示例
Microsoft已将Graph API作为M365服务的首选访问方式,相较于EWS,Graph API对Unified Group的支持更原生、权限模型更清晰,且长期维护更有保障。核心实现步骤如下:
权限配置
- 委托权限(个人账号):
Mail.Send或MailboxSettings.ReadWrite - 应用权限(服务账号):
Mail.Send.Application或Mail.ReadWrite(需管理员同意)
REST请求示例(创建邮件到组收件箱)
发送POST请求到Graph API端点:https://graph.microsoft.com/v1.0/groups/{group-id}/mailFolders/inbox/messages
请求体示例:
{ "subject": "Graph测试组邮件", "body": { "contentType": "HTML", "content": "这是通过Graph API写入Unified Group收件箱的邮件" }, "toRecipients": [ { "emailAddress": { "address": "group-smpt@contoso.com" } } ] }
认证方式:在请求头中携带OAuth 2.0 Token:Authorization: Bearer {your-access-token}
补充说明
- 可通过组的SMTP地址调用
https://graph.microsoft.com/v1.0/groups?$filter=mail eq 'group-smpt@contoso.com'获取group-id。 - 若需直接发送邮件而非保存到收件箱,可调用
https://graph.microsoft.com/v1.0/users/{user-id}/sendMail,将组邮箱作为收件人。
总结建议
- 若仅需快速适配现有EWS代码,可按上述调整SOAP请求和权限配置,无需添加多个身份模拟头。
- 若项目需长期维护或涉及更多M365 Group相关操作,强烈建议迁移到Graph API,其对Unified Group的支持更完善,且Microsoft后续的功能更新将优先覆盖Graph API。
内容的提问来源于stack exchange,提问作者Jeff McKay
相关产品推荐
相关产品推荐

