Как я могу получить доступ к электронной почте моей учетной записи с идентификатором учетной записи службы? - PullRequest
0 голосов
/ 07 января 2020

Я создал проект в облачной платформе Google и создал идентификатор учетной записи службы OAuth для своей учетной записи Gmail. С этим идентификатором учетной записи службы я не могу читать электронные письма, поскольку в нем говорится, что у меня нет доступа к этой области GmailReadonly.

Я прошел через Google и обнаружил, что мне нужен доступ к области действия от администратора Gsuite, но если доступ предоставлен, он говорит, что его можно использовать для получения всех электронных писем пользователей организации. Эта информация верна? Если да, есть ли другой способ получить доступ только к электронной почте моей учетной записи?

Ниже приведен код 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 Ответ

0 голосов
/ 07 января 2020

Вам необходимо создать учетную запись службы на Консоль разработчика Google , включить API Gmail. Затем вам нужно правильно настроить доменное имя с вашей учетной записью gsuite, прежде чем он начнет работать. настройки делегата

ServiceAccount.cs

 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);
            }
        }
    }
}

note

service3.Users.Messages.List(email).Execute();  

me будет служебной учетной записью который не имеет никаких писем. Вам нужно использовать пользователя. Вам необходимо указать адрес электронной почты пользователя, адрес электронной почты которого вы хотели бы получить. Это снова должен быть пользователь в домене gsuite.

...