Gmail Java API с использованием учетной записи службы GAE

Я пытаюсь читать сообщения Gmail с помощью учетной записи службы GAE. Код, аналогичный приведенному ниже, хорошо работает для чтения календаря Google, но не работает для Gmail. У меня только один пользователь в домене (который также является администратором). Я пытаюсь получить доступ к Gmail этого пользователя). Любая помощь в том, почему мой код не работает, была бы замечательной.

Я делегировал полномочия домена для следующих областей.

Email (Read/Write/Send)  https://mail.google.com/ 
https://www.googleapis.com/auth/admin.directory.user.readonly
Calendar (Read-Write)  https://www.googleapis.com/auth/calendar 
https://www.googleapis.com/auth/drive 
https://www.googleapis.com/auth/userinfo.email 
https://www.googleapis.com/auth/userinfo.profile

Я включил следующие API в Google App Engine:

Admin SDK
Calendar API
Drive API
Gmail API
Google Cloud SQL
Google Cloud Storage
Google Cloud Storage JSON API 

Ниже приведен код, который создает службу Gmail:

    // Create HTTP transport
    HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();


    // Create JsonFactory using com.google.api.client.json.jackson2.JacksonFactory
    JsonFactory jsonFactory = new JacksonFactory();

    // Get service accont (contain service account email and P12 file name)
    BaseGoogleService.GoogleServiceAccount serviceAccount = getGoogleServiceAccount();

    //load private key from class path to File object.
    Resource resource = appContext.getResource("classpath:"+serviceAccount.getServiceAccountPrivateKeyFile());
    File privateKeyFile = resource.getFile();

    // Create Google credential for service account
    List<String> accountScopes = new ArrayList<String>();
    accountScopes.add(GmailScopes.MAIL_GOOGLE_COM);
    Credential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(jsonFactory)
            .setServiceAccountId(serviceAccount.getServiceAccountId())
            .setServiceAccountScopes(accountScopes)
            .setServiceAccountPrivateKeyFromP12File(privateKeyFile)
            .build();

    // Create Gmail client

    Gmail gmailClient = new Gmail.Builder(httpTransport, jsonFactory, credential)
    .build();

Код, который читает сообщения Gmail:

ListMessagesResponse response = gmailClient.users().messages().list(userEmail).setQ(query).execute()

Я получаю сообщение об ошибке ниже, когда выполняю этот код

com.google.api.client.googleapis.json.GoogleJsonResponseException: 500 OK
{
  "code" : 500,
  "errors" : [ {
   "domain" : "global",
   "message" : "Backend Error",
   "reason" : "backendError"
  } ],
  "message" : "Backend Error"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest$1.interceptResponse(AbstractGoogleClientRequest.java:312)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1049)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)

person Srik    schedule 17.10.2014    source источник
comment
Я понял. Две вещи: 1. Необходимо добавить .setServiceAccountUser (userEmail) при создании GoogleCredential. 2. Это невозможно сделать для учетной записи администратора. Мне пришлось добавить пользователя в домен и получить доступ к Gmail этого пользователя.   -  person Srik    schedule 18.10.2014


Ответы (1)


Я смог заставить это работать.

Две вещи:

  1. Необходимо добавить ". SetServiceAccountUser (userEmail) " при создании GoogleCredential. userEmail представляет собой идентификатор электронной почты для олицетворения.
  2. Это невозможно сделать для учетной записи администратора. Мне пришлось добавить пользователя в домен и получить доступ к Gmail этого пользователя.
person Srik    schedule 18.10.2014