英文:
Microsoft.Graph.Models.ODataErrors.ODataError when trying to get message by Id. Microsoft Graph GraphServiceClient
问题
当我尝试使用GraphServiceClient从共享邮箱下载邮件时,我不断收到类型为'Microsoft.Graph.Models.ODataErrors.ODataError'的异常。
OData请求不受支持。
我已经搜索了这个问题,但没有得到可用的解决方案。
最初使用了应用程序权限Mail.ReadWrite。然后添加了Mail.Read、Mail.ReadBasic、Mail.ReadBasic.All,以查看是否有任何可用的解决方案。以下是我使用的代码示例。
ClientSecretCredential? _clientSecretCredential = new ClientSecretCredential(_settings.TenantId, _settings.ClientId, _settings.ClientSecret);
var graphServiceClient = new GraphServiceClient(_clientSecretCredential, new[] { "https://graph.microsoft.com/.default" });
var messages = await graphServiceClient.Users["email@account.com"].MailFolders["inbox"].Messages.GetAsync();
// messages返回3封邮件
foreach (var message in messages.Value)
{
// 这里引发了错误---------------------------------------
var messageStream = await graphServiceClient
.Users["email@account.com"]
.MailFolders["inbox"]
.Messages[message.Id]
.Content
.GetAsync();
//---------------------------------------------------------------
string path = "File_Path.eml";
using (FileStream fs = new FileStream(path, FileMode.CreateNew))
{
messageStream.CopyTo(fs);
}
}
如果您认为与Azure配置相关的任何问题,请告诉我,我会感激不已。
更新:
根据下面的答案,从消息请求中删除.MailFolders["inbox"]
,并添加TokenCredentialOptions解决了问题。
英文:
When I try to download an email from a shared mailbox using the GraphServiceClient I keep getting
Exception of type 'Microsoft.Graph.Models.ODataErrors.ODataError' was thrown.
The OData request is not supported.
I've googled the issue and haven't gotten a usable solution.
Originally started with app permission Mail.ReadWrite. From there added Mail.Read, Mail.ReadBasic,Mail.ReadBasic.All to see if anything would work. Below is a sample of the code that I'm using.
ClientSecretCredential? _clientSecretCredential = new ClientSecretCredential(_settings.TenantId, _settings.ClientId, _settings.ClientSecret);
var graphServiceClient = new GraphServiceClient(_clientSecretCredential,new[] { "https://graph.microsoft.com/.default" });
var messages = await graphServiceClient.Users["email@account.com"].MailFolders["inbox"].Messages.GetAsync();
//messages returns 3 emails
foreach (var message in messages.Value)
{
//this throws the error---------------------------------------
var messageStream = await graphServiceClient
.Users["email@account.com"]
.MailFolders["inbox"]
.Messages[message.Id]
.Content
.GetAsync();
//---------------------------------------------------------------
string path = "File_Path.eml";
using (FileStream fs = new FileStream(path, FileMode.CreateNew))
{
messageStream.CopyTo(fs);
}
}
If there is any gotcha's as far as Azure configurations you can think of that would be appreciated.
Update:
As per the answer below, removing .MailFolders["inbox"] from the message request and adding in TokenCredentialOptions fixed the issue.
答案1
得分: 2
- 我按照要求尝试过,也遇到了与您相同的错误。
- 然后,我更新了代码,请查看下方。
using Azure.Identity;
using Microsoft.Graph;
using System;
using System.IO;
namespace GraphApp
{
class MSGraph
{
static async Task Main(string[] args)
{
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenant_Id";
var clientId = "client_Id";
var clientSecret = "client_Secret";
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
try
{
var message = await graphClient.Users["User_UPN"]
.MailFolders["inbox"]
.Messages["message_ID"]
.GetAsync();
var mimeContentStream = await graphClient.Users["User_ID"]
.Messages[message.Id]
.Content
.GetAsync();
using (var fileStream = File.Create("C:\\Users\\xxxxxxx\\Desktop\\web1\\lastemail.eml"))
{
mimeContentStream.Seek(0, SeekOrigin.Begin);
await mimeContentStream.CopyToAsync(fileStream);
}
Console.WriteLine("电子邮件消息下载成功。");
}
catch (ServiceException ex)
{
Console.WriteLine($"访问 Graph API 时出错:{ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误:{ex.Message}");
}
}
}
}
- 当我执行上述代码时,.eml 文件成功下载到以下指定路径。
参考资料:
- 参考自 Glen Scales - 如何下载邮件 | Graph API | C#。
英文:
- I had tried as per the requirement, and I also faced the same error which you get.
- Then, I updated the code please check below.
using Azure.Identity;
using Microsoft.Graph;
using System;
using System.IO;
namespace GraphApp
{
class MSGraph
{
static async Task Main(string[] args)
{
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenant_Id";
var clientId = "client_Id";
var clientSecret = "client_Secret";
var options = new TokenCredentialOptions
{
AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var clientSecretCredential = new ClientSecretCredential(tenantId, clientId, clientSecret, options);
var graphClient = new GraphServiceClient(clientSecretCredential, scopes);
try
{
var message = await graphClient.Users["User_UPN"]
.MailFolders["inbox"]
.Messages["message_ID"]
.GetAsync();
var mimeContentStream = await graphClient.Users["User_ID"]
.Messages[message.Id]
.Content
.GetAsync();
using (var fileStream = File.Create("C:\\Users\\xxxxxxx\\Desktop\\web1\\lastemail.eml"))
{
mimeContentStream.Seek(0, SeekOrigin.Begin);
await mimeContentStream.CopyToAsync(fileStream);
}
Console.WriteLine("Email message downloaded successfully.");
}
catch (ServiceException ex)
{
Console.WriteLine($"Error accessing the Graph API: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
}
}
- When I executed the above code the .eml file download successful to the given path below
References:
- Referred from Glen Scales - How to Download a Mail | Graph API | C#.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论