Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过Gmail API谷歌应用程序引擎发送电子邮件_Java_Google App Engine_Google Cloud Platform_Gmail Api_Google Api Java Client - Fatal编程技术网

Java 通过Gmail API谷歌应用程序引擎发送电子邮件

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

尝试使用Gmail API向GAE发送电子邮件。之前我在凭证页面中创建了一个服务帐户密钥,它生成一个.P12文件,该文件位于SetServiceAccountPrivateKeyFromp12文件参数中。它有一个连接到帐户的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.googlejson响应异常:400 错误的请求 {代码:400, 错误:[{ 域名:全球, 消息:请求错误, 原因:失败的前提条件}], 消息:错误请求}


我不确定我在代码中或谷歌云控制台中设置的参数是错误的。我还可以尝试什么?

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

转到您的谷歌应用程序域的管理控制台

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

从列表中选择“显示更多”,然后选择“高级设置” 选项

在“身份验证”部分中选择“管理API客户端访问”

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

在一个或多个API作用域字段中,输入 您的应用程序应被授予访问权限。 对于 例如,如果 您的应用程序需要对Google Drive API进行全域访问 和谷歌日历API,输入: ,

单击“授权”

所有文件:

您也可以选择使用这样一个库,它将为您完成所有设置:

检查这个问题是否对您有帮助:@KENdi提供的链接有用吗?你是否能够缩小或解决失败的先决条件?它是@Nicholas。问题是我没有将服务帐户的全域授权配置为管理控制台。无论哪种方式,如果有人想使用Gmail API发送电子邮件,所有的代码都是完全有效的。这个问题可以补充回答如何在代码中使用电子邮件API授权发件人。一旦有人在该部分注册了电子邮件,如何引用该电子邮件。谢谢大家。谢谢你澄清这个问题。请随意将其作为答案发布,我将对此进行投票。问题是,它允许服务帐户访问指定范围内该域中的所有帐户,这可能并不理想。谷歌并没有提供一种方法,将其仅限于该领域内的一个或多个特定帐户。此外,它仅适用于G套件客户。普通的Gmail帐户没有这个。