尝试使用Gmail API
发送电子邮件到GAE
。以前我在“凭据”页面中创建了一个服务帐户密钥,它生成一个.P12 file
,它位于setServiceAccountPrivateKeyFromP12File
参数中。它有一个ID密钥连接到帐户[email protected]
到服务帐户页面。代码:
/* Application name. */
private static final String APPLICATION_NAME = "appnamefromappengine";
String emailAddress = "[email protected]";
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("[email protected]")
.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("[email protected]"));
message.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress("[email protected]"));
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, “errors”:[{“domain”:“global”,“message”:“Bad Request”,“reason”:“failedPrecondition”}], “消息”:“错误请求”}
我不确定我在代码或Google云端控制台中设置了哪个参数。我还能尝试什么?
问题是我没有将管理控制台中的委托域范围权限配置到管理控制台。
- 转到您的Google Apps域管理控制台。
- 从控件列表中选择安全性。如果未列出“安全性”列表,请从页面底部的灰色栏中选择“更多控件”,然后从控件列表中选择“安全性”。如果您看不到控件,请确保以域管理员身份登录。
- 从选项列表中选择显示更多,然后选择高级设置。
- 在Authentication部分中选择Manage API客户端访问。
- 在“客户名称”字段中,输入服务帐户的客户端ID。您可以在Developers Console的权限页面的“服务帐户”部分中找到您的服务帐户的客户端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
您可以选择使用像这样的库,它将为您完成所有设置:https://github.com/3wks/spring-gae-gmail