使用服务帐户的 Gmail API 集转发

Posted

技术标签:

【中文标题】使用服务帐户的 Gmail API 集转发【英文标题】:Gmail API Set Forwarding with Service Account 【发布时间】:2019-01-15 00:11:27 【问题描述】:

在调用 Gmail API 设置转发地址时遇到错误的请求失败前置条件错误,谁能提供帮助?下面是我正在尝试使用的 C# .Net 控制台应用程序。我已将域范围的权限委托给服务帐户。

错误

Google.Apis.Requests.RequestError 错误请求 [400] 错误 [ Message[Bad Request] Location[ - ] Reason[failedPrecondition] Domain[global] ]

我想我错过了模拟用户。所以,我添加了用户,现在我收到以下错误。

错误

错误:“unauthorized_client”,描述:“客户端未经授权无法使用此方法检索访问令牌。”,Uri:“”

namespace GmailForwarder

    class Program
    

        static string ApplicationName = "GmailForwarder";

        static void Main(string[] args)
        
            ServiceAccountCredential credential;
            string serviceAccount = "gmailforwarder@gmailforwarder.iam.gserviceaccount.com";
            var certificate = new X509Certificate2(@"key.p12", "notasecret", X509KeyStorageFlags.Exportable);

            try
            
                // Create credential
                credential = new ServiceAccountCredential(
                          new ServiceAccountCredential.Initializer(serviceAccount)
                          
                            User = "wtestboonew@chicagobooth.edu",
                            Scopes = new[]  GmailService.Scope.GmailSettingsSharing  
                          .FromCertificate(certificate));

                // Create Gmail API service.
                var service = new GmailService(new BaseClientService.Initializer()
                
                    HttpClientInitializer = credential,
                    ApplicationName = ApplicationName,
                );

                string user = "wtestboonew@chicagobooth.edu"; // test gmail account
                string fwdAddr = "acw5274@gmail.com";

                ForwardingAddress fwdAddress = new ForwardingAddress();
                fwdAddress.ForwardingEmail = fwdAddr;

                var createFwdAddressResult = service.Users.Settings.ForwardingAddresses.Create(fwdAddress,"me").Execute();     

            
            catch (Exception ex)
            

                 
        
    
 

【问题讨论】:

你能发布完整的错误信息吗? DalmTo 你能帮我解决这个问题吗?我有什么遗漏,做错了吗? 确保您在 gsuite 中正确设置了域范围的委派。那么您可以使用 Gmail api 服务 是的,我的系统管理员和我仔细检查了这一点,并为服务帐户设置了这一点。服务帐户的所有者(即我们在其下创建服务帐户的 google 管理员)是否需要启用域范围的委派?当我尝试通过 Google API 资源管理器运行它时,它说客户端(即服务帐户的所有者没有启用委派)。这与我在运行 .Net 应用程序时遇到的错误相同吗? 有没有办法以另一种方式测试服务帐户?我相信代码是正确的,但服务帐户没有访问权限,即使我在 G Suite 管理控制台中的 API Client Access 下注册了它 【参考方案1】:

当我使用 https://mail.google.com/ 和 https://www.googleapis.com/auth/gmail.settings.sharing OAuth2 范围时,这对我有用

【讨论】:

【参考方案2】:

我也遇到过这个问题(400 代码)。我遇到了两个问题:

1) 正如 ACW 所说,我在所需范围列表中缺少“https://mail.google.com/”,来自“https://www.googleapis.com/auth/gmail.settings.sharing”。

2) 我没有在管理控制台中将范围用引号 ("") 括起来(在为服务帐户指定范围时)。

希望对某人有所帮助

【讨论】:

以上是关于使用服务帐户的 Gmail API 集转发的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS:无法使用服务帐户访问 Gmail API

Gmail API 是不是支持使用 OAuth 服务帐户?

使用带有服务帐户的 Gmail API 发送邮件

通过服务器端的服务帐户使用 gmail api,避免使用 OAUTH2 GUI

Gmail API 服务帐户请求 - 前提条件检查失败

Gmail API - PHP - 使用服务帐户发送电子邮件