如何使用服务帐户使用Java通过GMAIL API发送电子邮件?

时间:2019-12-12 05:03:00

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

我正在尝试使用服务帐户通过GMAIL API从Google计算实例发送电子邮件。我已经按照this documentation执行了所有步骤,但是仍然收到一条错误消息,提示“ com.google.api.client.auth.oauth2.TokenResponseException:401未经授权”。

下面是相同的代码段。

public static void main( String[] args ) throws GeneralSecurityException, IOException, MessagingException
{
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    GoogleCredential credentialFromJson = GoogleCredential
            .fromStream(new FileInputStream(
                    "/Users/souravc/Documents/MySpaceSRV6100/Java_Samples/EmailTest/mail-auth.json"))
            .createScoped(Collections.singletonList(GmailScopes.GMAIL_SEND));

    GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(HTTP_TRANSPORT)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(credentialFromJson.getServiceAccountId())
            .setServiceAccountPrivateKey(credentialFromJson.getServiceAccountPrivateKey())
            .setServiceAccountScopes(SCOPES)
            .setServiceAccountUser("exampleemail").build();         

    //credential.refreshToken();

    Gmail service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build();

    String user = "me";
    Message123 obj = new Message123();
    obj.sendMessage(service, "me", obj.createEmail("exampleemail", "exampleemail",
            "Test", "Hi,\n\nTest Email\n\nThanks,\nSourav"));
}

在名为“ Message123 ”的类中,我编写了sendMessage()。下面是相同的代码。

public Message sendMessage(Gmail service, String userId, MimeMessage emailContent) throws MessagingException, IOException 
{
    Message message = createMessageWithEmail(emailContent);
    message = service.users().messages().send(userId, message).execute();
    System.out.println("Message id: " + message.getId());
    System.out.println(message.toPrettyString());
    return message;
}

注意:未将委派整个域的权限授予该服务帐户

您能帮忙吗?在这里,我想问一个更多的问题,即使我只是发送电子邮件而不读取/获取任何其他用户数据,我们是否需要为服务帐户分配委派整个域的权限?

非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

问题出在此

  

注意:未将委派整个域的权限授予该服务帐户

在您的用例中,您希望服务帐户代表您发送电子邮件。接近documentation

中提供的描述
  

例如,使用Google Calendar API将事件添加到G Suite域中所有用户的日历的应用程序将使用服务帐户代表用户访问Google Calendar API

401错误表示该服务帐户已通过身份验证(您将拥有403),但无权执行该操作,代表您发送电子邮件