用一个 API 获取所有用户和邮箱

Getting All Users and Mailboxes with One API

我支持一位 IT 管理员,他本人正在促进合规软件的使用。为此,我编写了一些 C# 代码来遍历目录中的所有用户,并对他们的消息执行操作。我当前的解决方案使用两个不同的 API 来实现这一点(下面的代码片段),但显然只使用一个 API 会更好。浏览了这里的其他帖子后,我未能找到关于如何实现这一目标的令人满意的明确答案。我的应用程序是一个服务帐户,启用了 Google Workspace 全域委派。我怎样才能只用一个 API 来完成我用两个做的事情?

[工作代码片段]

string domain; // domain name
string adminEmail; // admin e-mail
string directoryClientEmail; // client e-mail for Directory API
string directoryPrivateKey; // private key for Directory API
string directoryPrivateKeyId; // private key ID for Directory API
string gmailClientEmail; // client e-mail for Gmail API
string gmailPrivateKey; // private key for Gmail API
string gmailPrivateKeyId; // private key ID for Gmail API
CancellationToken cancellationToken; // a cancellation token

DirectoryService directoryClient = new DirectoryService(
    new BaseClientService.Initializer
    {
        HttpClientInitializer = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(creds.DirectoryClientEmail)
            {
                User = adminEmail,
                Scopes = new[] { DirectoryService.Scope.AdminDirectoryUser },
                Key = RSA.Create(directoryPrivateKey),
                KeyId = directoryPrivateKeyId
            }.FromPrivateKey(directoryPrivateKey))
    });

UsersResource.ListRequest userListRequest = directoryClient.Users.List();
userListRequest.Domain = domain;
Users userList = await userListRequest.ExecuteAsync(cancellationToken);

foreach (User user in userList)
{
    GmailService gmailClient = new GmailService(
        new BaseClientService.Initializer
        {
            HttpClientInitializer = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(gmailClientEmail)
                {
                    User = user.PrimaryEmail,
                    Scopes = new[] { GmailService.Scope.MailGoogleCom },
                    Key = RSA.Create(gmailPrivateKey),
                    KeyId = gmailPrivateKeyId
                }.FromPrivateKey(gmailPrivateKey))
        });

    ListRequest listRequest = new ListRequest(gmailClient, "me");
    ListMessageResponse listMessageResponse = await listRequest.ExecuteAsync(cancellationToken);

    foreach (Message message in listMessageResponse.Messages)
    {
        // do stuff
    }
}

要达到你想要的效果,你不能只用一个API。由于 Gmail API 不会给你域中的用户,但你可以用它获取用户的邮件;你需要的。所以 Gmail API 是必需的。

那么如果你想要一个最新的域用户列表,那么你需要使用目录 API,所以除非你在其他地方有用户列表,否则你需要这个 API 也是。