使用 Gmail api 时尝试获取电子邮件列表时出现错误 [403]

Posted

技术标签:

【中文标题】使用 Gmail api 时尝试获取电子邮件列表时出现错误 [403]【英文标题】:Error [403] in trying to get list of emails when using Gmail api 【发布时间】:2021-12-11 02:04:39 【问题描述】:

我正在尝试做一个非常简单的任务。使用 Google.Apis 的 api 获取电子邮件列表。 这是我得到的错误:

Google.Apis.Requests.RequestError
   Delegation denied for association8385@gmail.com [403]
   Errors [
  Message[Delegation denied for association8385@gmail.com] Location[ - ] Reason[forbidden] 
  Domain[global] ]

这是我的代码:

    using (FileStream stream = new(emailSettings.Value.ClientCredentials, FileMode.Open, 
           FileAccess.Read))
    

       string folderPath =  emailSettings.Value.CredentialsInfo;
       string filePath = Path.Combine(folderPath, "APITokenCredentials");

       _credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.FromStream(stream).Secrets,
                _scopes, 
                "user", 
                CancellationToken.None, 
                new FileDataStore(filePath, true)).Result;

    
    _service = new GmailService(new BaseClientService.Initializer()
    
        HttpClientInitializer = _credential,
        ApplicationName = emailSettings.Value.ApplicationName
    );

    UsersResource.MessagesResource.ListRequest listRequest = 
         _service.Users.Messages.List(_hostAddress);
        listRequest.LabelIds = "INBOX";
        listRequest.IncludeSpamTrash = false;
        listRequest.Q = "is:unread";
        ListMessagesResponse listReqponse = listRequest.Execute() ;

当我尝试执行 listRequest.Execute()

时发生崩溃

我已启用 Gmail API 和 People Api。我已创建 ClientCredentials json。我还创建了我的 OAuth 2.0 客户端 ID 作为 Web 应用程序。创建服务时,会创建必要的令牌。对于这个简单的任务,我怀疑这是一个配置问题。

谁能给我指出正确的方向

【问题讨论】:

【参考方案1】:

您收到的错误消息有点奇怪,这表明您正在尝试使用服务帐户进行身份验证。然而,您使用的代码是用于已安装的应用程序,您提到您正在尝试使用 Web 应用程序凭据,不幸的是您正在使用的代码是用于已安装的应用程序。

我刚刚使用来自谷歌开发者控制台的已安装客户端运行了您的代码,“并进行了一些修复”,这很有效。

class Program
    

        private static readonly string creds = @"C:\YouTube\dev\credentials.json";
        private static readonly string credsPath ="creds";
        
        static void Main(string[] args)
        
            UserCredential _credential;
            
            using (var stream = new FileStream(creds, FileMode.Open, FileAccess.Read))
            

                var filePath = Path.Combine(credsPath, "APITokenCredentials");

                _credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.FromStream(stream).Secrets,
                    new [] Google.Apis.Gmail.v1.GmailService.Scope.GmailModify, 
                    "user", 
                    CancellationToken.None, 
                    new FileDataStore(filePath, true)).Result;

            
            var _service = new GmailService(new BaseClientService.Initializer()
            
                HttpClientInitializer = _credential,
                ApplicationName = "emailSettings.Value.ApplicationName"
            );

            var request = _service.Users.Messages.List("me");
            request.LabelIds = "INBOX";
            request.IncludeSpamTrash = false;
            request.Q = "is:unread";
            var response = request.Execute() ;       

        

如果您尝试使用 asp .net core 或 .net 5 创建 Web 应用程序,那么您应该遵循类似的内容

Asp .net core google login我没有 gmail 的示例,但如果您需要,我可以将它们放在一起。

【讨论】:

【参考方案2】:

根据我的研究,我目前的方法不适用于我必须完成的其他任务。我相信我应该使用服务帐户。 所以对于这个这个问题已经回答了。 谢谢

【讨论】:

以上是关于使用 Gmail api 时尝试获取电子邮件列表时出现错误 [403]的主要内容,如果未能解决你的问题,请参考以下文章

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

尝试在 Java 中使用 Gmail API 发送电子邮件时出错

使用 PHP 向使用 Gmail API 发送的电子邮件添加密件抄送

尝试使用 Google.Apis.Gmail 从 asp.net core web api 应用程序从谷歌工作区发送电子邮件时出错

GMail API:获取收件箱中最早的电子邮件的最快方式

使用 Gmail API 获取邮件正文