You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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格式邮件字节流,和你之前传给EWS UploadItem的data完全一致即可。
  • 默认文件夹上传:如果不需要指定目标文件夹,直接使用graphClient.Users[targetUserId].Messages.Request().AddAsync(message),邮件会上传到用户默认收件箱。
  • 批量迁移优化:若需批量上传,可使用Graph API的批量请求减少网络交互次数。

内容的提问来源于stack exchange,提问作者Don Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:37:55