Gmail REST API : 400 错误请求 + 失败前提条件
我正在尝试使用谷歌Java API服务基于Gmail REST API发送邮件。我通过Google Develover Console配置了一个应用程序客户端,并下载了p12和json文件。
我已经使用了此示例程序,https://developers.google.com/gmail/api/guides/sending#sending_messages...
此示例有效,但这是基于 GoogleAuthorizationCodeFlow。我只想从服务器到服务器工作,直接调用,而不是打开浏览器来获取访问令牌...我得到了它(访问令牌),但最后我收到了一个错误的请求....为什么???我没有收到比“错误请求”和“前提条件失败”更多的信息
基于此,我遵循以下步骤:
-
第一步:根据我的客户帐户邮件和 p12 生成的文件创建一个 GoogleCredential 对象:
GoogleCredential credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport()) .setJsonFactory(new JacksonFactory()) .setServiceAccountId(serviceAccountUserEmail) .setServiceAccountScopes(scopes) .setServiceAccountPrivateKeyFromP12File( new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH)) .build();
在这里,我必须指出,我有很多问题来使用ClientID而不是ClientMail。它必须使用 @developer.gserviceaccount.com 帐户而不是 .apps.googleusercontent.com 。如果你不发送这个参数 ok ,你会得到一个“无效的授权”错误。这里对此进行了解释:https://developers.google.com/analytics/devguides/config/mgmt/v3/mgmtAuthorization
-
第二步 :根据凭据创建Gmail服务:
Gmail gmailService = new Gmail.Builder(httpTransport, jsonFactory, credential) .setApplicationName(APP_NAME) .build();
-
第三步从 MimmeMessage 创建 Google 原始消息:
private static Message _createMessageWithEmail(final MimeMessage email) throws MessagingException, IOException { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); email.writeTo(bytes); String encodedEmail = Base64.encodeBase64URLSafeString(bytes.toByteArray()); Message message = new Message(); message.setRaw(encodedEmail); return message;
}
-
第四步调用服务:
Message message = _createMessageWithEmail(email); message = service.users() .messages() .send(userId,message) .execute();
- 第五步:执行后获取结果...在这里,我收到异常:
线程“主”中的异常
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Bad Request",
"reason" : "failedPrecondition"
} ],
"message" : "Bad Request"
}
at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:145)
任何想法什么是错的,或者哪个是前提条件失败了??