首页 文章

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

提问于
浏览
1

尝试使用Gmail API将电子邮件发送到App Engine . 以前我在“凭据”页面中创建了一个服务帐户密钥,它生成一个.P12文件,该文件位于setServiceAccountPrivateKeyFromP12File参数中 . 它有一个ID密钥加入帐户somename@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 Bad Request {“code”:400,“errors”:[{“domain”:“global”,“message”:“Bad Request”,“reason” “:”failedPrecondition“}],”message“:”Bad Request“}

我不确定我在代码或Google Cloud 端控制台中设置了哪个参数 . 我还能尝试什么?

2 回答

  • 2

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

    转到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/日历 . 单击“授权” .

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

  • 0

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

相关问题