【发布时间】:2020-04-05 10:57:29
【问题描述】:
我正在尝试使用服务帐户通过 GMAIL API 从 google 计算实例发送电子邮件。我按照this documentation 执行了所有步骤,但仍然收到一条错误消息,提示“com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized”。
下面是相同的代码sn-p。
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;
}
注意:委派域范围的权限尚未授予服务帐户
你能帮忙吗?在这里我想再问一个问题,即使我只是发送电子邮件而不读取/获取任何其他用户数据,我们是否需要为服务帐户分配域范围的授权?
提前感谢您的帮助
【问题讨论】:
-
哪个语句抛出异常?
-
最后一条语句。 "obj.sendMessage(service, "me", obj.createEmail("exampleemail", "exampleemail", "Test", "Hi,\n\nTest Email\n\nThanks,\nSourav"));"
-
SCOPES变量的值是多少? -
@guillaume blaquiere 值是
https://www.googleapis.com/auth/gmail.send -
您在 GSuite 域中吗?您的电子邮件的发件人不是电子邮件地址
.setServiceAccountUser("exampleemail"),我不知道这是否是问题。
标签: google-cloud-platform google-compute-engine gmail-api google-oauth google-api-java-client