通过Gmail API Google App Engine发送电子邮件

问题描述 投票:1回答:2

尝试使用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云端控制台中设置了哪个参数。我还能尝试什么?

java google-app-engine google-cloud-platform gmail-api google-api-java-client
2个回答
2
投票

问题是我没有将管理控制台中的委托域范围权限配置到管理控制台。

  1. 转到您的Google Apps域管理控制台。
  2. 从控件列表中选择安全性。如果未列出“安全性”列表,请从页面底部的灰色栏中选择“更多控件”,然后从控件列表中选择“安全性”。如果您看不到控件,请确保以域管理员身份登录。
  3. 从选项列表中选择显示更多,然后选择高级设置。
  4. 在Authentication部分中选择Manage API客户端访问。
  5. 在“客户名称”字段中,输入服务帐户的客户端ID。您可以在Developers Console的权限页面的“服务帐户”部分中找到您的服务帐户的客户端ID。
  6. 在“一个或多个API范围”字段中,输入应授予应用程序访问权限的范围列表。例如,如果您的应用需要在域范围内访问Google Drive API和Google Calendar API,请输入:https://www.googleapis.com/auth/drivehttps://www.googleapis.com/auth/calendar
  7. 单击“授权”。

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.