当前位置: 首页 > 知识库问答 >
问题:

Gmail API服务帐户

云承弼
2023-03-14

我想用gmail API阅读我的gmail收件箱。我需要使用服务帐户,因为我的应用程序没有用户交互。我在请求时收到以下错误:

“InnerException={”错误:\“unauthorized\u client\”,描述:\“请求中的未授权客户端或作用域。\”,Uri:\“\”}

这是我的代码:

        string applicationName = "Gmail API .NET";
        string[] scopes = { GmailService.Scope.GmailReadonly };

        string certPath = "./XXXXXXXXXX.p12";
        string userEmail = "MYEMAIL@gmail.com";
        string serviceAccountEmail = "MYSERVICEACCOUNT...am.gserviceaccount.com";

        //Carga el certificado obtenido de 
        var certificate = new X509Certificate2(certPath, "notasecret", X509KeyStorageFlags.Exportable);

        ServiceAccountCredential credential = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(serviceAccountEmail)
            {
                User = userEmail,
                Scopes = scopes
            }.FromCertificate(certificate)
        );

        if (credential.RequestAccessTokenAsync(CancellationToken.None).Result) <--- Here I get the error
        {
            GmailService gs = new GmailService(
                new BaseClientService.Initializer()
                {
                    ApplicationName = applicationName,
                    HttpClientInitializer = credential
                }
            );
        }

我做错了什么?有人能帮我吗?

当做

共有3个答案

太叔正文
2023-03-14

你试过谷歌提供的这个函数的示例代码了吗?

  using Google.Apis.Gmail.v1;
 using Google.Apis.Gmail.v1.Data;

 // ...

 public class MyClass {

   // ...

 /// <summary>
 /// Retrieve a Message by ID.
 /// </summary>
 /// <param name="service">Gmail API service instance.</param>
 /// <param name="userId">User's email address. The special value "me"
 /// can be used to indicate the authenticated user.</param>
 /// <param name="messageId">ID of Message to retrieve.</param>
 public static Message GetMessage(GmailService service, String userId, String messageId)
 {
     try
     {
         return service.Users.Messages.Get(userId, messageId).Execute();
     }
     catch (Exception e)
     {
         Console.WriteLine("An error occurred: " + e.Message);
     }

     return null;
 }

 // ...

}

您是否在此处尝试过API explorer:https://developers.google.com/gmail/api/v1/reference/users/messages/get#net输入了你的申请信息?它从API页面起作用了吗?

太叔京
2023-03-14

您只能使用服务帐户为GSuite帐户而不是gmail帐户发送电子邮件。

如果你有一个gmail帐户,你可以使用3条腿的OAuth2身份验证或打开2FA,生成一个应用程序密码并使用它,如图所示

如果您使用的是GSuite帐户,您可以使用ServiceAccount,但您必须确保它具有此处所述的G套件域范围的授权,然后您需要按照此处所述授予对GSuite域的访问权限

戚锦
2023-03-14

请尝试在中查看有关服务帐户的文档。NET图书馆。本文档还为您提供了一个示例代码,您可以根据该代码了解如何设置服务帐户。此链接还可以让您了解如何使用服务帐户访问GMAIL API。

现在,对于您收到的错误,如果可以帮助您,请检查此链接。

>

  • Gmail API支持使用OAuth服务帐户吗?

    Gmail Api在请求中返回未经授权的客户端或作用域

  •  类似资料:
    • 我正在使用谷歌服务帐户将MySQL备份从我们的网络服务器推送到谷歌云端硬盘,使用谷歌API PHP客户端脚本设置为cron作业。 我现在想在多个网络服务器上运行相同的脚本,我不知道如何正确配置服务号,应该吗? > 是否在所有服务器上使用相同的服务帐户和服务帐户密钥/凭据? 或者使用相同的服务帐户,但为每个服务器添加服务帐户密钥/凭据? 还是为每台服务器设置单独的服务帐户?

    • 我正在尝试通过服务帐户(客户端电子邮件和p12证书)连接到google doubeclick api,使用python客户端库,如以下示例所示: http://code.google.com/p/google-api-python-client/source/browse/samples/service_account/tasks.py 它给我一个空access_token: 这有什么意义?我有没

    • Googleapi版本:libs-sources/google-api-services-drive-v2-rev168-1.20.0-sources.jar java版本:“1.7.0_79”java(TM)SE运行时环境(build 1.7.0_79-B15)java HotSpot(TM)64位服务器VM(build 24.79-B02,混合模式) 还将下载的p12文件加载到\jdk1.7.

    • 我开发了以下代码,用于自动执行我的一些实例的启动/停止任务,这些实例不需要一直运行,而是在特定范围内运行。 这是我的代码:https://github.com/maartinpii/gcp-shst 我按照谷歌云平台指南(参考:https://cloud.google.com/iam/docs/understanding-service-accounts https://cloud.google.

    • 我目前正在研究Office 365 API。是否可以创建一个服务帐户,该帐户将代表应用程序而不是用户调用API? 谷歌有以下内容:https://developers.google.com/accounts/docs/OAuth2#serviceaccount 谢谢 感谢您回复我。是否可以使用API执行以下操作。我想这是我在另一个博客上读到的,但我只是想证实这一点。http://blogs.msd

    • 我正在调查AWS/Google云基础架构系统是否可以混合,我的要求之一是从一个系统到另一个系统的安全和简单的身份验证。目前,我需要从一个Google Cloud VM实例连接到一个受限的AWS S3 bucket。 我的问题通常是:有没有办法做到这一点,什么是最好的方法。我相信每个人都希望有机会使用多个云提供商为他们的基础设施提供高安全性、易用性和维护性。 经过一些研究,我发现唯一可能的方法是通过