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

时间:2016-06-24 14:21:23

标签: java google-app-engine google-cloud-platform gmail-api google-api-java-client

尝试使用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   错误的请求   {“code”:400,
  “错误”:[{       “域名”:“全球”,       “消息”:“错误请求”,       “理由”:“failedPrecondition”}],
  “message”:“Bad Request”}

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

2 个答案:

答案 0 :(得分:2)

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

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

  2.   
  3. 从控件列表中选择安全性。如果你没有看到安全性   列出,从灰色栏中选择更多控件       在页面底部,然后从控件列表中选择安全性。       如果您看不到控件,请确保您已登录为       域名管理员。

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

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

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

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

  12.   
  13. 点击授权。

  14.   

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

答案 1 :(得分:0)

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