我已将GSuite服务帐户配置为访问公司用户的gmail帐户,并且在G Suite管理员控制台中为它提供了所有权限,包括域范围访问。我创建了一个服务帐户,现在想使用凭据代表他们发送电子邮件。
到目前为止,这是我的代码:
public void gmailTest(){ log.info("Gmail test"); List<String> SCOPES = new ArrayList<String>(GmailScopes.all()); // List<String> SCOPES = GmailScopes.all(); InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("Program Name-12345678.json"); try { if(resourceAsStream != null) { NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport(); log.info("Reading credential file"); GoogleCredential credential = GoogleCredential.fromStream(resourceAsStream); log.info("Creating scopes"); credential = credential.createScoped(SCOPES); log.info("building gmail api service"); Gmail gmailService = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName("ept-mailer").build(); String user = "deusrex@mygenericdomain.com"; log.info("calling gmail api"); ListLabelsResponse listResponse = gmailService.users().labels().list(user).execute(); log.info("call did not error"); List<Label> labels = listResponse.getLabels(); if (labels.isEmpty()) { System.out.println("No labels found."); } else { System.out.println("Labels:"); for (Label label : labels) { System.out.printf("- %s\n", label.getName()); } } } } catch (IOException | GeneralSecurityException ex) { log.error(ex.getMessage()); }
这是我的特权:
Email (Manage labels) https://www.googleapis.com/auth/gmail.labels https://www.googleapis.com/auth/gmail.metadata Email (Read/Write) https://www.googleapis.com/auth/gmail.modify
这是我得到的错误:
400 Bad Request { "code" : 400, "errors" : [ { "domain" : "global", "message" : "Bad Request", "reason" : "failedPrecondition" } ], "message" : "Bad Request" }
好的答案是,创建凭据时必须指定用户。在较新版本的API中,此调用已更改为:.createDelegated()。只需向用户发送您希望在其中模拟的电子邮件即可。
GoogleCredential credential = GoogleCredential.fromStream(resourceAsStream).createDelegated("deusrex@mygenericdomain.com");