1

我正在嘗試使用GAE服務帳戶閱讀Gmail郵件。類似於下面的代碼很適合閱讀Google日曆,但不適用於Gmail。我在域中只有一個用戶(他也是管理員帳戶)。我試圖訪問該用戶的Gmail)。任何關於爲什麼我的代碼失敗的幫助會很好。使用GAE服務帳戶的Gmail Java API

我已經委派了以下範圍的域範圍權限。

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啓用:

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

下面是創建Gmail服務代碼:

:讀取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(); 

代碼

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

我開了g以下錯誤時我執行此代碼

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) 
+1

我明白了。有兩件事: 1.在構建GoogleCredential時必須添加「.setServiceAccountUser(userEmail)」。 2.這不能爲管理員帳戶完成。我不得不將用戶添加到域中並訪問該用戶的Gmail。 – Srik 2014-10-18 00:09:20

回答

1

我能夠使其工作。

兩件事情:

  1. 具有添加".setServiceAccountUser(userEmail)"同時建設GoogleCredential。 userEmail表示要模擬的電子郵件ID。
  2. 這不能爲管理員帳戶完成。我不得不將用戶添加到域中並訪問該用戶的Gmail。
相關問題