如何将EWS Managed API的UploadItemFts函数迁移至Graph API?
从EWS UploadItem迁移到Graph API的解决方案
EWS的UploadItem本质是上传完整的RFC822格式(.eml)邮件字节流,以此保留邮件所有原始属性。Graph API没有完全对应的同名接口,但可以通过上传MIME格式邮件实现完全一致的效果,以下是具体方案:
核心实现思路
使用Graph API的POST /users/{userId}/folders/{folderId}/messages端点,将原始邮件字节流转换为Base64字符串后,作为mimeContent字段传入,即可创建包含所有原始属性的邮件。
C#代码示例(使用Graph SDK)
首先安装必要的NuGet包:
Install-Package Microsoft.Graph Install-Package Azure.Identity
实现对应的上传方法:
using Microsoft.Graph; using Azure.Identity; using System; using System.Threading.Tasks; public async Task<string> UploadFullMessageToGraph(string targetUserId, string targetFolderId, byte[] rawEmailData) { // 初始化Graph客户端(根据你的身份验证场景调整,示例使用客户端凭据模式) var scopes = new[] { "https://graph.microsoft.com/.default" }; var clientId = "YOUR_CLIENT_ID"; var tenantId = "YOUR_TENANT_ID"; var clientSecret = "YOUR_CLIENT_SECRET"; var credential = new ClientSecretCredential(tenantId, clientId, clientSecret); var graphClient = new GraphServiceClient(credential, scopes); try { var message = new Message { MimeContent = new MimeContent { Type = "message/rfc822", Content = Convert.ToBase64String(rawEmailData) } }; // 上传到指定目标文件夹 var uploadedMessage = await graphClient.Users[targetUserId] .Folders[targetFolderId] .Messages .Request() .AddAsync(message); return uploadedMessage.Id; } catch (ServiceException ex) { // 捕获并处理Graph服务异常,逻辑同EWS的ServiceResponseException处理 var errorDetails = $"Graph API Error: {ex.Message}, Error Code: {ex.Error.Code}"; // 替换为你的日志逻辑 // XLogger.Debug(this, $"UploadFullMessageToGraph >> ServiceException >> {errorDetails}"); throw new Exception(errorDetails); } }
关键注意事项
- 权限要求:需要为应用或用户分配
Mail.ReadWrite权限(针对目标邮箱),跨租户迁移时需确保权限范围覆盖目标租户。 - 数据兼容性:传入的
rawEmailData必须是完整的RFC822格式邮件字节流,和你之前传给EWSUploadItem的data完全一致即可。 - 默认文件夹上传:如果不需要指定目标文件夹,直接使用
graphClient.Users[targetUserId].Messages.Request().AddAsync(message),邮件会上传到用户默认收件箱。 - 批量迁移优化:若需批量上传,可使用Graph API的批量请求减少网络交互次数。
内容的提问来源于stack exchange,提问作者Don Lee
相关产品推荐
相关产品推荐

