尝试使用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 错误的请求 {“code”:400,
“错误”:[{ “域名”:“全球”, “消息”:“错误请求”, “理由”:“failedPrecondition”}],
“message”:“Bad Request”}
我不确定我在代码或Google云控制台中设置了哪个参数。我还能尝试什么?
答案 0 :(得分:2)
问题是我没有将管理控制台的代理域范围权限配置到管理控制台。
转到Google Apps域的管理控制台。
从控件列表中选择安全性。如果你没有看到安全性 列出,从灰色栏中选择更多控件 在页面底部,然后从控件列表中选择安全性。 如果您看不到控件,请确保您已登录为 域名管理员。
从列表中选择显示更多,然后选择高级设置 选项。
在“身份验证”部分中选择“管理API客户端访问”。
在“客户名称”字段中,输入服务帐户的客户端ID。您 可以找到您的服务帐户的客户端ID 在里面 服务 开发者控制台的权限页面的帐户部分。
在“一个或多个API范围”字段中,输入范围列表 您的应用程序应被授予访问权限。 对于 如果,如果 您的应用需要在域范围内访问Google Drive API 和Google Calendar API,输入: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar
- 醇>
点击授权。
所有文件:
https://developers.google.com/identity/protocols/OAuth2ServiceAccount
答案 1 :(得分:0)
您可以选择使用像这样的库,他将为您完成所有设置: https://github.com/3wks/spring-gae-gmail