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

如何获取Google Vault中Matter所有者的邮箱地址?

如何获取Google Vault中Matter所有者的邮箱地址?

我来帮你一步步解决这个问题,结合你已经拥有的权限和需求,给你具体的C#实现方案:

一、Google Vault API能否直接返回所有者邮箱?

很遗憾,不能。不管你用Matters.List还是Matters.Get接口,哪怕指定了FULL视图,matter.Owner字段返回的始终是用户的Google Workspace唯一ID(就是你看到的那串长数字)。这是因为Vault API本身不存储用户的邮箱等身份信息,它只关联用户的内部ID。

二、用Admin SDK Directory API将Owner ID映射为邮箱

你已经启用了Admin SDK Directory API,并且拥有https://www.googleapis.com/auth/admin.directory.user.readonly权限,这正是解决问题的关键!matter.Owner的ID就是Directory API中对应的user.id,完全可以用它来查询用户的邮箱地址。

具体实现步骤(C#)

  1. 安装Admin SDK NuGet包
    如果还没安装,在Visual Studio的NuGet包管理器中搜索Google.Apis.Admin.Directory.directory_v1并安装。

  2. 初始化DirectoryService实例
    用你现有的认证凭据(比如服务账号密钥)创建DirectoryService,和VaultService的初始化逻辑一致:

    using Google.Apis.Admin.Directory.directory_v1;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Services;
    
    // 替换为你的服务账号密钥路径
    var credential = GoogleCredential.FromFile("service-account-key.json")
        .CreateScoped(new[] { DirectoryService.Scope.AdminDirectoryUserReadonly });
    
    var directoryService = new DirectoryService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = "你的应用名称"
    });
    
  3. 封装根据User ID获取邮箱的方法
    写一个复用方法,调用Directory API的用户查询接口:

    private async Task<string> GetUserEmailByUserId(string userId)
    {
        try
        {
            var userRequest = directoryService.Users.Get(userId);
            // 只请求邮箱字段,减少响应数据量
            userRequest.Fields = "primaryEmail";
            var user = await userRequest.ExecuteAsync();
            return user.PrimaryEmail;
        }
        catch (Exception ex)
        {
            // 处理异常:比如用户已删除、权限不足等
            Console.WriteLine($"获取用户邮箱失败:{ex.Message}");
            return null;
        }
    }
    
  4. 结合Vault API获取带邮箱的Matter信息
    把上面的方法和你现有的Vault查询逻辑结合:

    // 示例1:批量获取所有Matter的所有者邮箱
    var listRequest = vaultService.Matters.List();
    listRequest.View = MattersResource.ListRequest.ViewEnum.FULL;
    var response = await listRequest.ExecuteAsync();
    
    foreach (var matter in response.Matters)
    {
        var ownerEmail = await GetUserEmailByUserId(matter.Owner);
        Console.WriteLine($"Matter ID: {matter.MatterId}, 所有者邮箱: {ownerEmail ?? "未知用户"}");
    }
    
    // 示例2:获取单个Matter的所有者邮箱
    var getRequest = vaultService.Matters.Get("你的Matter ID");
    getRequest.View = MattersResource.GetRequest.ViewEnum.FULL;
    var singleMatter = await getRequest.ExecuteAsync();
    var singleOwnerEmail = await GetUserEmailByUserId(singleMatter.Owner);
    Console.WriteLine($"单个Matter所有者邮箱: {singleOwnerEmail}");
    

三、关于Holds和Exports的创建者邮箱

你提到的Holds和Exports的创建者信息,在Vault API的Hold对象的createdBy字段、Export对象的createdBy字段,返回的同样是用户ID。你可以用完全相同的方法,把这个ID传入GetUserEmailByUserId方法,就能得到创建者的邮箱地址。

四、注意事项

  1. 权限要求:调用Directory API的账号必须拥有Google Workspace的用户读取权限(比如是Workspace管理员,或被授予了User Management只读权限)。
  2. 异常处理:如果matter.Owner对应的用户已被删除,Directory API会返回404错误,记得在代码中捕获并处理这类情况。
  3. 异步优化:示例中使用async/await异步调用,建议在实际项目中保持异步逻辑,避免阻塞主线程。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 10:33:06