我正在尝试使用服务帐户通过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;
}
注意:未将委派整个域的权限授予该服务帐户
您能帮忙吗?在这里,我想问一个更多的问题,即使我只是发送电子邮件而不读取/获取任何其他用户数据,我们是否需要为服务帐户分配委派整个域的权限?
非常感谢您的帮助
答案 0 :(得分:2)
问题出在此
注意:未将委派整个域的权限授予该服务帐户
在您的用例中,您希望服务帐户代表您发送电子邮件。接近documentation
中提供的描述例如,使用Google Calendar API将事件添加到G Suite域中所有用户的日历的应用程序将使用服务帐户代表用户访问Google Calendar API
401错误表示该服务帐户已通过身份验证(您将拥有403),但无权执行该操作,代表您发送电子邮件