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

如何使用服务号id访问我的帐户电子邮件?

陆琦
2023-03-14

我在谷歌云平台上创建了一个项目,并为我的gmail帐户创建了一个OAuth服务帐户id。使用此服务帐户id,我无法阅读电子邮件,因为它说我无法访问此范围Gmail只读。

我通过谷歌搜索发现,我需要从Gsuite admin获得范围访问权限,但如果提供了访问权限,它表示可以使用该权限检索所有组织用户的电子邮件。这个信息正确吗?如果是的话,有没有其他方法可以访问我账户的电子邮件?

下面是我用来访问电子邮件的c#代码。如果有什么方法可以实现,请告诉我。

 #region saggezza account id read
        ServiceAccountCredential serviceAccountCredential = new ServiceAccountCredential(
          new ServiceAccountCredential.Initializer("xxx@projectname.iam.gserviceaccount.com")
          {
              User = "xxx@organization.com",
              Scopes = new[] { GmailService.Scope.GmailReadonly }
          }.FromPrivateKey("-----BEGIN PRIVATE KEY-----xxxxxxxxxxxxxxxxx-----END PRIVATE KEY-----\n"));

        if (serviceAccountCredential != null)
        {
            var service3 = new GmailService(new BaseClientService.Initializer
            {
                HttpClientInitializer = serviceAccountCredential,
                ApplicationName = ApplicationName
            });

            var list = service3.Users.Messages.List("me").Execute();
            var count = "Message Count is: " + list.Messages.Count();                
        }

共有1个答案

潘国源
2023-03-14

你需要在谷歌开发者控制台上创建一个服务帐户,启用Gmail api。然后,在gsuite帐户开始工作之前,您需要正确地设置域范围的代理。代理设置

 public static class ServiceAccountExample
    {

        /// <summary>
        /// Authenticating to Google using a Service account
        /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount
        /// </summary>
        /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param>
        /// <param name="serviceAccountCredentialFilePath">Location of the .p12 or Json Service account key file downloaded from Google Developer console https://console.developers.google.com</param>
        /// <returns>AnalyticsService used to make requests against the Analytics API</returns>
        public static GmailService AuthenticateServiceAccount(string serviceAccountEmail, string serviceAccountCredentialFilePath, string[] scopes, string email)
        {
            try
            {
                if (string.IsNullOrEmpty(serviceAccountCredentialFilePath))
                    throw new Exception("Path to the service account credentials file is required.");
                if (!File.Exists(serviceAccountCredentialFilePath))
                    throw new Exception("The service account credentials file does not exist at: " + serviceAccountCredentialFilePath);
                if (string.IsNullOrEmpty(serviceAccountEmail))
                    throw new Exception("ServiceAccountEmail is required.");                

                // For Json file
                if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".json")
                {
                    GoogleCredential credential;
                    using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read))
                    {
                        credential = GoogleCredential.FromStream(stream)
                             .CreateScoped(scopes);
                    }

                    // Create the  Analytics service.
                    return new GmailService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = credential,
                        ApplicationName = "Gmail Service account Authentication Sample",
                    });
                }
                else if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".p12")
                {   // If its a P12 file

                    var certificate = new X509Certificate2(serviceAccountCredentialFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
                    var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
                    {
                        user = email,
                        Scopes = scopes
                    }.FromCertificate(certificate));

                    // Create the  Gmail service.
                    return new GmailService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = credential,
                        ApplicationName = "Gmail Authentication Sample",
                    });
                }
                else
                {
                    throw new Exception("Unsupported Service accounts credentials.");
                }

            }
            catch (Exception ex)
            {                
                throw new Exception("CreateServiceAccountGmailFailed", ex);
            }
        }
    }
}
service3.Users.Messages.List(email).Execute();  

me将是没有任何电子邮件的服务号。您需要使用一个用户。您需要提供您想访问的电子邮件用户的电子邮件地址。这也必须是gSuite域上的用户。

 类似资料:
  • 因此,我实际上是试图通过IMAP使用Node连接到Outlook/Exchange电子邮件帐户。 使用旧的Live Connect API,我可以使用OAuth2令牌(https://msdn.microsoft.com/en-us/windows/desktop/DN440163)执行IMAP命令。但这似乎对Exchange帐户不起作用,因为试图用这些帐户执行Oauth流只会带来一个错误“此Mi

  • 如何专门为服务帐户而不是用户帐户启用API服务? 上下文:我正在使用一个Python脚本本地测试一个云函数(查询BQ,将结果转换为json,加入GCS bucket)。我可以用我自己的测试帐户来做这件事,在那里我能够启用服务,但是不确定我将如何为客户的服务帐户做这件事(或者客户如何着手做这件事)。我自己的服务账户是这样做的: 作为JSON获取服务帐户凭据 跟踪gcloud cloud SDK的安装

  • 使用NodeEmailer,如何使用别名gmail帐户发送电子邮件?还是组google suite服务器帐户? 比如说: 我的真实帐户: 我将使用nodemailer通过我的别名帐户或组帐户发送消息。 我的别名帐户:< code > myaliascount @ domain . com 我的群帐户:< code > my group account @ domain . com 这可能吗?

  • 我想授予服务帐户访问Google Secrets Manager中的秘密的权限。 我可以像这样获得这个秘密: 但是当我的服务号尝试相同的命令时,gCloud会发出以下错误: 错误:(gcloud.beta.secrets.versions.access)权限被拒绝:请求的身份验证范围不足。 主要问题是:我还需要做些什么来确保服务帐户可以访问该机密? 我已授予该服务帐户“roles/secretma

  • 我正在尝试从应用程序发送电子邮件。 问题是Gmail不允许我进行身份验证,因为位置不寻常——当然,每个应用程序都安装在其他位置。 我的代码(使用Javax): 该代码在我的测试设备上运行良好,但在其他使用我的应用程序的设备上崩溃。 我得到的错误:javax.mail.身份验证失败异常:534-5.7.14请通过534-5.7.14您的网络浏览器登录,然后重试。534-5.7.14在534 5.7.

  • 您可以通过此界面创建和管理域的电子邮件帐户。 您可以创建电子邮件地址,配置邮件客户端,更改密码以及直接访问您的Webmail。 创建电子邮件地址 要为您的域创建电子邮件地址,请按以下步骤操作 - Step 1 - 单击cPanel主页的“电子邮件”部分中的“ Email Accounts链接。 Step 2 - 在电子邮件帐户中,您会在顶部找到添加电子邮件帐户。 Step 3 - 添加您要创建的电