全部
我尝试了使用服务帐户的 Gmail API。我实现了以下代码:
package mywork.gmail.api;
import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.gmail.model.ListMessagesResponse;
import com.google.api.services.gmail.model.Message;
public class GmailApi {
/** Email of the Service Account */
private static final String SERVICE_ACCOUNT_EMAIL = "******@developer.gserviceaccount.com";
/** Path to the Service Account's Private Key file */
private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH = "src/main/resources/*******-privatekey.p12";
public static void main(String[] args) throws Exception {
GmailApi app = new GmailApi();
String userId = "****@example.com";
String labelId = "INBOX";
app.listMessage(userId, labelId);
}
public void listMessage(String userId, String labelId) throws Exception {
Gmail service = initService(userId);
ListMessagesResponse response = service.users().messages().list(userId)
.setLabelIds(Arrays.asList(labelId)).execute();
List<Message> messages = new ArrayList<Message>();
while (response.getMessages() != null) {
messages.addAll(response.getMessages());
if (response.getNextPageToken() != null) {
String pageToken = response.getNextPageToken();
response = service.users().messages().list(userId)
.setPageToken(pageToken).execute();
} else {
break;
}
}
for (Message message : messages) {
System.out.println(message.toPrettyString());
}
}
private Gmail initService(String userId) throws GeneralSecurityException,
IOException {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(Arrays.asList(GmailScopes.MAIL_GOOGLE_COM))
.setServiceAccountUser(userId)
.setServiceAccountPrivateKeyFromP12File(new File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
.build();
Gmail service = new Gmail.Builder(httpTransport, jsonFactory, credential)
.setApplicationName("Gmail API sample").build();
return service;
}
}
但该代码返回 403 错误:
Exception in thread "main" com.google.api.client.auth.oauth2.TokenResponseException: 403 Forbidden
{
"error" : "access_denied",
"error_description" : "Requested client not authorized."
}
当然,我通过 Google Developer Console 启用了 Gmail API,并通过管理控制台设置了权限(包括 Gmail 范围)。
怎么了?
谢谢!