【问题标题】:Gmail API returns "Delegation denied for my.email@email.com" when setting a different email as recipient将其他电子邮件设置为收件人时,Gmail API 返回“my.email@email.com 的委托被拒绝”
【发布时间】:2021-09-30 02:21:48
【问题描述】:

我正在使用 Gmail API 创建草稿。 当我创建收件人是我自己的电子邮件(生成凭据的电子邮件)的草稿消息时,一切正常,但是当我尝试使用其他电子邮件时,会打印以下消息:

{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Delegation denied for my.email.here@gmail.com",
    "reason" : "forbidden"
  } ],
  "message" : "Delegation denied for my.email.here@gmail.com",
  "status" : "PERMISSION_DENIED"
}
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:146)

这就是我组装MimeMessage的方式:

val props = Properties()
val session = Session.getDefaultInstance(props, null)
val message = MimeMessage(session)
message.setFrom(message.sender)
message.addRecipient(JavaxMessage.RecipientType.TO, InternetAddress("different.email.here@gmail.com"))
message.subject = subject

我正在使用的范围:

// "https://www.googleapis.com/auth/gmail.compose"
GmailScopes.GMAIL_COMPOSE

我已经尝试了很多东西来使它工作,但我没有任何成功。

【问题讨论】:

    标签: kotlin gmail-api


    【解决方案1】:

    my.email.here@gmail.com 的委派被拒绝

    此电子邮件似乎是标准的 gmail 电子邮件地址。您似乎正在尝试将服务帐户委派给具有标准 gmail 电子邮件地址的用户。

    服务帐户仅适用于 google 工作区电子邮件帐户。您需要为 serveries 帐户设置域范围的委派,然后您可以设置委派用户。

    如果您想使用标准 gmail 帐户,您需要使用 Oauth2 授权用户。

    private fun getCredentials(httpTransport: NetHttpTransport): Credential? {
        val inputStream = File("credentials.json").inputStream()
        val clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, InputStreamReader(inputStream))
        val flow = GoogleAuthorizationCodeFlow.Builder(httpTransport, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(FileDataStoreFactory(File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build()
        val receiver = LocalServerReceiver.Builder().setPort(8888).build()
        return AuthorizationCodeInstalledApp(flow, receiver).authorize("user")
    }
    
    
    
     public static MimeMessage createEmail(String to,
                                              String from,
                                              String subject,
                                              String bodyText)
                throws MessagingException {
            Properties props = new Properties();
            Session session = Session.getDefaultInstance(props, null);
    
            MimeMessage email = new MimeMessage(session);
    
            email.setFrom(new InternetAddress(from));
            email.addRecipient(javax.mail.Message.RecipientType.TO,
                    new InternetAddress(to));
            email.setSubject(subject);
            email.setText(bodyText);
            return email;
        }
    

    Sending

    【讨论】:

    • 感谢您的回复。我不太明白这部分:“服务帐户仅适用于谷歌工作区电子邮件帐户。您需要为服务器帐户设置域范围的委派,然后您可以设置委派用户。”,我该怎么做?我需要有一个网络域吗?再次感谢:D
    • Google workspace 是 GSuite 的新名称。它是一组用于企业的工具。如果您想将服务帐户与 gmail 一起使用,您需要拥有一个工作区帐户,它仅适用于该域上的电子邮件帐户。您不能将其与普通用户帐户一起使用。
    • 嗯。因此,创建带有“随机”收件人电子邮件的草稿电子邮件并不像人们想象的那么容易:/。知道了,你知道是否可以从“Gmail”对象(授权应用程序的对象)中检索用户电子邮件?
    • 我刚刚意识到如何。我忘记使用execute(): gmail.users().getProfile("me").execute().emailAddress
    【解决方案2】:

    感谢@DaImTo 的回复和提供的所有信息。


    根据提供的信息,对于那些和我有同样问题的人,我找到了一个很好的解决方法:

    • 将“收件人”设置为用户的电子邮件;
    • 将“密件抄送”收件人添加到实际收件人电子邮件中。

    这是演示它的代码:

        val meProfile = gmail.users().getProfile("me").execute()
        val toRecipient = InternetAddress(meProfile.emailAddress)
        val ccRecipient = InternetAddress(to)
    
        val props = Properties()
        val session = Session.getDefaultInstance(props, null)
        val message = MimeMessage(session)
        message.setFrom(message.sender)
    
        // here's the magic :D
        message.addRecipient(JavaxMessage.RecipientType.TO, toRecipient)
        message.addRecipient(JavaxMessage.RecipientType.BCC, ccRecipient)
    
        message.subject = subject
    

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2014-11-25
      • 1970-01-01
      • 2015-02-03
      • 2011-03-19
      • 1970-01-01
      相关资源
      最近更新 更多