【问题标题】:Sending email using ClientCredentialProvider is failing to find tenant guid使用 ClientCredentialProvider 发送电子邮件无法找到租户 guid
【发布时间】:2020-06-16 13:13:01
【问题描述】:

我正在使用 Microsoft Identity 的 OAuth 2.0 支持来使用 Microsoft Graph 发送电子邮件。

创建了一个个人电子邮件帐户为 XXXX@outlook.com。我使用此帐户登录 Azure AD 并在那里创建一个租户。使用ClientCredentialProvider(来自 msgraph-sdk-auth-java)作为授权人尝试向自己发送电子邮件。 步骤:

  1. 已创建租户帐户。
  2. 在 Graph>Application->Send.email 等中创建了一个应用程序并授予权限
  3. 已创建密钥

以下是我得到的错误:

发布microsoft.graph.sendMail SdkVersion:graph-java/v1.5.0 授权:Bearer _xv1yPye...

{
  "message": {
    "subject": "Test",
    "body": {
      "contentType": "text",
      "content": "The new cafeteria is open bujji."
    },
    "toRecipients": [
      {
        "emailAddress": {
          "address": "xxxxx@outlook.com"
        }
      }
    ]
  },
  "saveToSentItems": true
}401: UnauthorizedStrict-Transport-Security: max-age=31536000Cache-Control: privatex-ms-ags-diagnostic: {
  "ServerInfo": {
    "DataCenter": "South India",
    "Slice": "SliceC",
    "Ring": "3",
    "ScaleUnit": "001",
    "RoleInstance": "AGSFE_IN_1"
  }
}client-request-id: 01565263-11b4-45f7-b089-06f57fdd8241request-id: 2e0cac3b-dc32-4dab-bb30-769590fc156eContent-Length: 361Date: Tue,
16Jun202007: 14: 42GMTContent-Type: application/json{
  "error": {
    "code": "OrganizationFromTenantGuidNotFound",
    "message": "The tenant for tenant guid \u002706841624-5828-4382-b0a0-XXXXXX87b08f\u0027 does not exist.",
    "innerError": {
      "requestId": "01565263-11b4-45f7-b089-06f57fdd8241",
      "date": "2020-06-16T07:14:43",
      "request-id": "2e0cac3b-dc32-4dab-bb30-769590fc156e"
    }
  }
}

private static void sendEmail() {
    ClientCredentialProvider authProvider = new ClientCredentialProvider(
        "fb7f0ecc-b498-XXXX-XXXX-b016f252ea7d",
        Arrays.asList("https://graph.microsoft.com/.default"),
        "8-rpF8sOwV.CWF~7gK.XXXXXXXX.SSScxj0",
        "06841624-5828-4382-b0a0-XXXXXXe87b08f",
        NationalCloud.Global);
    IGraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider(authProvider).buildClient();

    Message message = new Message();
    message.subject = "Test";
    Ite * mBody body = new ItemBody();
    body.contentType = BodyType.TEXT;
    body.content = "The new cafeteria is open.";
    message.body = body;
    LinkedList < Recipient > toRecipientsList = new LinkedList < Recipient > ();
    Recipient toRecipients = new Recipient();
    EmailAddress emailAddress = new EmailAddress();
    emailAddress.address = "xxxxx@outlook.com";
    toRecipients.emailAddress = emailAddress;
    toRecipientsList.add(toRecipients);
    message.toRecipients = toRecipientsList;
    graphClient.me()
        .sendMail(message, true)
        .buildRequest()
        .post();
}

【问题讨论】:

  • 嗨,你有机会看看我的回答吗?如果您还有任何问题,请随时告诉我。
  • 已回答您的新问题:)

标签: java azure email microsoft-graph-api microsoft-graph-mail


【解决方案1】:

我猜你想使用 Microsoft Graph API 从你的个人帐户电子邮件XXXX@outlook.com 发送电子邮件。

但是当你使用这个账号登录Azure AD并创建一个租户,并在你的代码中使用ClientCredentialProvider时,这个账号会被当作你租户的工作账号(不是个人账号)。

因此,当工作帐户要发送电子邮件时,将需要 O365 订阅的 Exchange 在线许可证。您没有具有 Exchange 在线许可证的 O365 订阅。这就是您收到此错误的原因:The tenant for tenant guid \u002706841624-5828-4382-b0a0-XXXXXX87b08f\u0027 does not exist.

如果您想从您的个人帐户发送电子邮件,则无需创建 AAD 租户。你应该使用Authorization code provider 而不是Client credentials provider。另一件事是个人帐户需要委托权限而不是基于Send mail permissions 的应用程序权限。创建一个应用程序并在 Graph > Delegated > Mail.Send 中授予权限。

请注意,它可能需要https://graph.microsoft.com/mail.send 而不是https://graph.microsoft.com/.default 的范围。

【讨论】:

  • 您说的是我使用个人帐户时 1)。无需创建租户 2.) 创建应用程序并授予委派权限。 3.) 在Authorization code Provider中使用没有租户ID的构造函数。
  • @bibhutik 哦,很抱歉弄错了。您需要创建一个租户,以便您可以创建应用程序并授予委派权限。但是您应该将权限的值配置为https://login.microsoftonline.com/common 而不是https://login.microsoftonline.com/{your tenant}。通过使用common,它会将您的帐户视为个人帐户。
【解决方案2】:

感谢艾伦的帮助。我可以从我的 Outlook 帐户发送和接收电子邮件。使用授权码提供者 1. 登录到 Azure AD,在“来自个人帐户的应用程序”中创建一个应用程序。 2. 授予权限Graph > Delegated > Mail.Send。 3.提供重定向URL为http://localhost:8080/muapp"。记下所有appId,创建一个密钥。 4.现在点击下面的URL详细信息

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=40fcd457-1807-49e3-8bce-XXXXXX40ca194&response_type=code&redirect_uri=https://localhost/myapp/&response_mode=query&scope=openid%20offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fmail.send%20https%3A%2F%2Fgraph.microsoft.com%2Fmail.read&state=12345

5。获取代码。这个代码我们需要传入Authorization code provider。 6.作用域“https://graph.microsoft.com/mail.send” 7.权限“https://login.microsoftonline.com/consumers

每次发送电子邮件时我都有一个问题,我必须获取代码。有什么办法可以有到期日等???

【讨论】:

  • 我认为您不必每次发送电子邮件时都获取代码。只需使用graphClient。访问令牌的默认生命周期为一小时。另外,如果我的回答对你有帮助,你应该标记我的答案,而不是你的,这样可以鼓励别人帮助你。
  • @AllenWu 现在我启用了工作帐户。但它需要 full_access 权限才能使用 EWS 访问任何邮箱,这是很大的安全风险。您能帮助我如何在没有 full_access 的情况下利用 ClientCredentialProvider 或其他任何东西吗?我的应用程序是恶魔应用程序。
猜你喜欢
  • 2013-05-28
  • 2019-07-01
  • 2015-06-11
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2021-04-13
  • 2021-09-12
相关资源
最近更新 更多