Java 通过Gmail API谷歌应用程序引擎发送电子邮件
尝试使用Gmail API向GAE发送电子邮件。之前我在凭证页面中创建了一个服务帐户密钥,它生成一个.P12文件,该文件位于SetServiceAccountPrivateKeyFromp12文件参数中。它有一个连接到帐户的ID密钥example@appspot.gserviceaccount.com进入服务帐户页面。守则:Java 通过Gmail API谷歌应用程序引擎发送电子邮件,java,google-app-engine,google-cloud-platform,gmail-api,google-api-java-client,Java,Google App Engine,Google Cloud Platform,Gmail Api,Google Api Java Client,尝试使用Gmail API向GAE发送电子邮件。之前我在凭证页面中创建了一个服务帐户密钥,它生成一个.P12文件,该文件位于SetServiceAccountPrivateKeyFromp12文件参数中。它有一个连接到帐户的ID密钥example@appspot.gserviceaccount.com进入服务帐户页面。守则: /* Application name. */ private static final String APPLICATION_NAME = "appnam
/* 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.googlejson响应异常:400
错误的请求
{代码:400,
错误:[{
域名:全球,
消息:请求错误,
原因:失败的前提条件}],
消息:错误请求}
我不确定我在代码中或谷歌云控制台中设置的参数是错误的。我还可以尝试什么?问题是我没有配置将服务帐户的域范围权限委托到管理控制台 转到您的谷歌应用程序域的管理控制台 从控件列表中选择安全性。如果你没有看到安全 在列表中,从底部的灰色栏中选择更多控件 在页面底部,然后从控件列表中选择安全性。 如果看不到控件,请确保您是以管理员身份登录的 域的管理员 从列表中选择“显示更多”,然后选择“高级设置” 选项 在“身份验证”部分中选择“管理API客户端访问” 在“客户端名称”字段中输入服务帐户的客户端ID。您可以 可以找到您的服务帐户的客户端ID 在 服务 开发人员控制台的“权限”页面的“帐户”部分 在一个或多个API作用域字段中,输入 您的应用程序应被授予访问权限。 对于 例如,如果 您的应用程序需要对Google Drive API进行全域访问 和谷歌日历API,输入: , 单击“授权” 所有文件:
您也可以选择使用这样一个库,它将为您完成所有设置:
检查这个问题是否对您有帮助:@KENdi提供的链接有用吗?你是否能够缩小或解决失败的先决条件?它是@Nicholas。问题是我没有将服务帐户的全域授权配置为管理控制台。无论哪种方式,如果有人想使用Gmail API发送电子邮件,所有的代码都是完全有效的。这个问题可以补充回答如何在代码中使用电子邮件API授权发件人。一旦有人在该部分注册了电子邮件,如何引用该电子邮件。谢谢大家。谢谢你澄清这个问题。请随意将其作为答案发布,我将对此进行投票。问题是,它允许服务帐户访问指定范围内该域中的所有帐户,这可能并不理想。谷歌并没有提供一种方法,将其仅限于该领域内的一个或多个特定帐户。此外,它仅适用于G套件客户。普通的Gmail帐户没有这个。