【发布时间】:2016-10-27 04:59:10
【问题描述】:
尝试使用Gmail API 向GAE 发送电子邮件。以前我在凭据页面中创建了一个服务帐户密钥,它会生成一个.P12 file,它位于setServiceAccountPrivateKeyFromP12File 参数中。它有一个 ID 密钥加入到帐户 example@appspot.gserviceaccount.com 到服务帐户页面。代码:
/* Application name. */
private static final String APPLICATION_NAME = "appnamefromappengine";
String emailAddress = "somename@appspot.gserviceaccount.com";
JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
try {
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
Set<String> scopes = new HashSet<String>();
scopes.add(GmailScopes.GMAIL_SEND);
scopes.add(GmailScopes.GMAIL_COMPOSE);
scopes.add(GmailScopes.MAIL_GOOGLE_COM);
scopes.add("https://www.googleapis.com/auth/admin.directory.user");
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(emailAddress)
.setServiceAccountPrivateKeyFromP12File(new File("/home/myuser/Test/src/main/webapp/resources/**somename**cd30e7118ad5.p12"))
.setServiceAccountScopes(scopes)
.setServiceAccountUser("somename@appspot.gserviceaccount.com")
.build();
Gmail gmail = new Gmail
.Builder(httpTransport, JSON_FACTORY, credential)
.setApplicationName(APPLICATION_NAME)
.build();
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("someemail@gmail.com"));
message.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress("recipient@gmail.com"));
message.setSubject("Test Mail");
message.setText("Test Mail");
Message msg = createMessageWithEmail(message); //createMessageWithEmail function from Gmail API
msg = gmail.users().messages().send(emailAddress, msg).execute();
System.out.println("Mail was sent. Message id: " + msg.getId());
} catch (GeneralSecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
它返回给我这个错误:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 错误的请求 { "代码" : 400,
“错误”:[{ “域”:“全球”, “消息”:“错误请求”, “原因”:“失败的前提条件”}],
“消息”:“错误请求”}
我不确定我在代码中或 Google 云控制台中设置了错误的参数。我还能尝试什么?
【问题讨论】:
-
检查这个 SO 问题Gmail REST API : 400 Bad Request + Failed Precondition 如果它可以帮助你:)
-
@KENdi 提供的链接有用吗?您是否能够缩小或解决失败的先决条件?
-
是@Nicholas。问题是我没有将服务帐户的域范围权限配置到管理控制台。无论哪种方式,如果有人想使用 Gmail API 发送电子邮件,所有代码都可以正常工作。该问题可以补充回答如何在代码中使用电子邮件 API 授权的发件人。一旦有人在该部分注册了电子邮件,如何引用该电子邮件。谢谢大家。
-
感谢您澄清问题。随时将其发布为答案,我会投赞成票。
标签: java google-app-engine google-cloud-platform gmail-api google-api-java-client