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

我们可以使用服务帐户访问GMAIL API吗?

谷奕
2023-03-14

我有一个桌面应用程序,可以在REST界面上使用GMAIL API阅读邮件。我想使用服务帐户,这样我们就可以下载邮件使用域设置和用户交互是空的。我成功地创建了Gmail服务实例,但当我尝试访问任何Gmail API方法,比如获取邮件列表或任何其他方法时,我会遇到一个异常,说:

谷歌。API。啊。OAuth2。响应。TokenResponseException:错误:“访问被拒绝”,描述:“请求的客户端未授权。”

我完成了开发者控制台的所有设置,并将范围添加到我的gapps域。

Gmail API支持服务帐户吗?使用相同的设置和服务帐户,我可以使用驱动器服务和API获取Google drive中所有文件的列表。

共有3个答案

邹禄
2023-03-14

下面是python 3.7的一点介绍:

from google.oauth2 import service_account
from googleapiclient.discovery import build

def setup_credentials():
    key_path = 'gmailsignatureproject-zzz.json'
    API_scopes =['https://www.googleapis.com/auth/gmail.settings.basic',
                 'https://www.googleapis.com/auth/gmail.settings.sharing']
    credentials = service_account.Credentials.from_service_account_file(key_path,scopes=API_scopes)
    return credentials


def test_setup_credentials():
    credentials = setup_credentials()
    assert credentials


def test_fetch_user_info():
    credentials = setup_credentials()
    credentials_delegated = credentials.with_subject("tim@vci.com.au")
    gmail_service = build("gmail","v1",credentials=credentials_delegated)
    addresses = gmail_service.users().settings().sendAs().list(userId='me').execute()
    assert gmail_service
长孙阳州
2023-03-14

如果你想读取邮件,你需要更新的Gmail API(而不是旧的管理员设置API,它被指出丢失在二进制文件中)。是的,你可以用oAuth2和更新的Gmail API来做这件事,你需要在Cboard中将开发人员列入白名单,并创建一个可以用来签名请求的密钥——设置需要一点时间:https://developers.google.com/accounts/docs/OAuth2ServiceAccount#formingclaimset

蔚弘量
2023-03-14

我使用以下C#代码从服务帐户访问Gmail

String serviceAccountEmail =
    "999999999-9nqenknknknpmdvif7onn2kvusnqct2c@developer.gserviceaccount.com";

var certificate = new X509Certificate2(
    AppDomain.CurrentDomain.BaseDirectory +
        "certs//fe433c710f4980a8cc3dda83e54cf7c3bb242a46-privatekey.p12",
    "notasecret",
    X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);

string userEmail = "user@domainhere.com.au";

ServiceAccountCredential credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer(serviceAccountEmail)
    {
        User = userEmail,
        Scopes = new[] { "https://mail.google.com/" }
    }.FromCertificate(certificate)
);

if (credential.RequestAccessTokenAsync(CancellationToken.None).Result)
{   
    GmailService gs = new GmailService(
        new Google.Apis.Services.BaseClientService.Initializer()
        {
            ApplicationName = "iLink",
            HttpClientInitializer = credential
        }
    );

    UsersResource.MessagesResource.GetRequest gr =
        gs.Users.Messages.Get(userEmail, msgId);
    gr.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw;
    Message m = gr.Execute();

    if (gr.Format == UsersResource.MessagesResource.GetRequest.FormatEnum.Raw)
    {
        byte[] decodedByte = FromBase64ForUrlString(m.Raw);
        string base64Encoded = Convert.ToString(decodedByte);
        MailMessage msg = new MailMessage();
        msg.LoadMessage(decodedByte);
    }
}
 类似资料:
  • 我正在尝试使用服务帐户访问目录API(https://developers.google.com/admin-sdk/Directory/v1/reference/users/list)。最简单的任务是列出组织中的用户。通过OAuth2.0 PlayGorund测试,这在我的用户帐户中运行良好。但我需要使用服务帐户。我正在阅读关于双腿OAuth(https://developers.google.

  • 是否可以使用服务帐户访问Google Admin Report SDK? 我有一个非常基本的例子,我正在尝试运行,我总是得到一个400错误返回。我已经验证了密钥和服务ID是正确的,我甚至已经将权限委托给这个服务帐户。难道这就是不可能吗?有人有什么想法吗? 返回的错误如下: {“代码”:401,“错误”:[{“domain”:“global”,“location”:“authorization”,“

  • 问题内容: 我们在使用服务帐户访问代理商API时遇到问题。具有客户机密的示例运行良好,但是我们需要将其部署在k8s(Kubernetes Engine)中,而无需定期刷新oauth会话(尤其是执行一次,因为在docker容器中有点难)。 尽管有很多关于如何使用python进行操作的文档,但我们找不到使用服务帐户进行访问的任何方法。 我们尝试了两个帐户,一个为默认计算引擎,一个为我们的用例直接创建。

  • 我有一个G套件域,并用域范围的授权打开一个服务号。服务号在项目中也有所有者身份。我启用gmail应用编程接口并添加范围参考(https://developers.google.com/admin-sdk/directory/v1/guides/delegation“将域范围的权限委托给您的服务号”)我也启用不太安全的应用程序设置。 这是我的代码: 但是当我使用这个令牌尝试列出电子邮件时:GETht

  • 我在谷歌云平台上创建了一个项目,并为我的gmail帐户创建了一个OAuth服务帐户id。使用此服务帐户id,我无法阅读电子邮件,因为它说我无法访问此范围Gmail只读。 我通过谷歌搜索发现,我需要从Gsuite admin获得范围访问权限,但如果提供了访问权限,它表示可以使用该权限检索所有组织用户的电子邮件。这个信息正确吗?如果是的话,有没有其他方法可以访问我账户的电子邮件? 下面是我用来访问电子

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