【问题标题】:Send email through Gmail API Google App Engine通过 Gmail API Google App Engine 发送电子邮件
【发布时间】:2016-10-27 04:59:10
【问题描述】:

尝试使用Gmail APIGAE 发送电子邮件。以前我在凭据页面中创建了一个服务帐户密钥,它会生成一个.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


【解决方案1】:

问题是我没有将服务帐户的域范围权限配置到管理控制台。

  1. 转到您的 Google Apps 域的管理控制台。

  2. 从控件列表中选择安全。如果您没有看到安全性 列表中,从底部的灰色栏中选择更多控件 页面底部,然后从控件列表中选择安全性。 如果您看不到控件,请确保您以 域管理员。

  3. 从列表中选择显示更多,然后选择高级设置 选项。

  4. 在身份验证部分选择管理 API 客户端访问。

  5. 在“客户端名称”字段中输入服务帐户的客户端 ID。你 可以找到您的服务帐号的客户端 ID 在里面 服务 开发者控制台权限页面的帐户部分。

  6. 在一个或多个 API 范围字段中,输入范围列表 您的应用程序应该被授予访问权限。 为了 例如,如果 您的应用程序需要在域范围内访问 Google Drive API 和 Google Calendar API,输入: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/calendar.

  7. 点击授权。

所有文档:
https://developers.google.com/identity/protocols/OAuth2ServiceAccount

【讨论】:

  • 这样做的问题是它使服务帐户可以访问指定范围内此类域中的所有帐户,这可能并不理想。 Google 没有提供仅将其限制为该域中的单个或多个特定帐户的方法。此外,它仅适用于 G Suite 客户。普通的 Gmail 帐户没有这个。
【解决方案2】:

您可以选择使用像这样的库,它会为您完成所有设置: https://github.com/3wks/spring-gae-gmail

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 2010-10-27
    • 2019-01-24
    • 1970-01-01
    • 2016-10-19
    • 2020-02-26
    • 1970-01-01
    • 2020-01-06
    • 2021-04-18
    相关资源
    最近更新 更多