我有一个应用程序尝试使用 Microsoft Graph 发送电子邮件,然后检索相同的消息以将一些信息导入我们的数据库。
在对此进行研究之后,建议的技巧是将唯一的信息附加到消息中,然后使用该值搜索消息。在 Graph/Mail 的情况下,该方法是一个SingleValueExendedProperty
.
我在应用程序和 LinqPad 环境中都可以进行测试。但是,我很少遇到 Graph 无法找到电子邮件的情况。我跟踪了消息,并能够InternetId
通过消息跟踪找到并一直在尝试解决问题。
我可以使用 Graph SDK 从 Graph SDK 获取消息,但InternetId
不能使用他们全部。我开始怀疑这是图表的问题?SingleValueExtendedProperty
SingleValueExtendedProperty
InternetId
我的代码中使用的 GUID 只是内部日志记录/事件 ID,因此它们并不是真正的秘密,出于安全原因,其余敏感信息已被忽略。
下面是我在 LinqPad 中使用包Microsoft.Graph
3.12.0、4.18.0Microsoft.Identity.Client
和Microsoft.Graph.Auth
1.0.0-preview5进行测试的代码
Guid propertyNamespace = Guid.Parse("75CF8950-C01A-4D68-850D-13E7E49C12C0"); //Just a random GUID to use as my namespace
async Task Main()
{
//Just including these to be thorough, obviously the real values are omitted for security
var clientId = "";
var tenantId = "";
var secret = "";
var clientApplication = Microsoft.Identity.Client.ConfidentialClientApplicationBuilder.Create(clientId)
.WithAuthority(Microsoft.Identity.Client.AzureCloudInstance.AzurePublic, tenantId)
.WithClientSecret(secret)
.Build();
var authProvider = new Microsoft.Graph.Auth.ClientCredentialProvider(clientApplication);
var graphClient = new Microsoft.Graph.GraphServiceClient(authProvider);
//This will locate the message correctly
var messageById = await GetMessage(graphClient, "user.name@example.com", "ABCDEF1234567890@FAKE.CANPRD01.PROD.OUTLOOK.COM"); //Fake `InternetId`, but you get the point
//This will not find the message
var messageByProperty = await GetMessage(graphClient, "user.name@example.com", "EventId", Guid.Parse("6c105c1e-cb55-4ba4-90f6-ac2b01084a54"));
var propertyFoundById = messageById.SingleValueExtendedProperties.Single();
$"'{propertyFoundById.Id}' '{propertyFoundById.Value}'".Dump("propertyFoundById");
$@"singleValueExtendedProperties/Any(ep: ep/id eq 'String {propertyNamespace:B} Name {"EventId"}' and ep/value eq '{Guid.Parse("6c105c1e-cb55-4ba4-90f6-ac2b01084a54")}')".Dump("Expression when filtering by property");
/*
The above two Dump() statements will spit out the following strings respectively
'String {75cf8950-c01a-4d68-850d-13e7e49c12c0} Name EventId' '6c105c1e-cb55-4ba4-90f6-ac2b01084a54'
singleValueExtendedProperties/Any(ep: ep/id eq 'String {75cf8950-c01a-4d68-850d-13e7e49c12c0} Name EventId' and ep/value eq '6c105c1e-cb55-4ba4-90f6-ac2b01084a54')
*/
}
///<summary>A method to locate a message by searching with the SingleValueExtendedProperties</summary>
private async Task<Microsoft.Graph.Message> GetMessage(Microsoft.Graph.GraphServiceClient graphClient, string mailbox, string propertyName, Guid propertyValue)
{
var message = (await graphClient.Users[mailbox].MailFolders["SentItems"].Messages.Request()
.Filter($@"singleValueExtendedProperties/Any(ep: ep/id eq 'String {propertyNamespace:B} Name {propertyName}' and ep/value eq '{propertyValue}')")
.Expand($"singleValueExtendedProperties($filter=id eq 'String {propertyNamespace:B} Name EventId')")
.GetAsync())
.SingleOrDefault();
return message;
}
///<summary>A method to locate a message by searching with the InternetId<summary>
private async Task<Microsoft.Graph.Message> GetMessage(Microsoft.Graph.GraphServiceClient graphClient, string mailbox, string internetId)
{
var message = (await graphClient.Users[mailbox].MailFolders["SentItems"].Messages.Request()
.Filter($@"internetMessageId eq '<{internetId}>'")
.Expand($"singleValueExtendedProperties($filter=id eq 'String {propertyNamespace:B} Name EventId')")
.GetAsync())
.SingleOrDefault();
return message;
}
我检查了SingleValueExtendedProperty
它通过 InternetId 找到的消息,并将其与其他方法中使用的过滤器表达式进行比较,细节看起来相同。然而,这似乎是应用程序发送的极少数电子邮件(大约 175 条中的 3 条)所独有的,因为如果我在 LinqPad 中发送新的
var message = new Microsoft.Graph.Message();
message.SingleValueExtendedProperties = new Microsoft.Graph.MessageSingleValueExtendedPropertiesCollectionPage();
message.SingleValueExtendedProperties.Add(new Microsoft.Graph.SingleValueLegacyExtendedProperty { Id = $"String {propertyNamespace:B} Name {propertyName}", Value = Guid.Parse("11111111-2222-3333-4444-555555555555").ToString() });
/* Other fields excluded for brevity */
await graphClient.Users["user.name@example.com"].SendMail(message, true).Request().PostAsync();
然后GetMessage()
我上面使用的两种方法(一种使用 InternetId,另一种使用SingleValueExtendedProperties
)在我查找此新消息时都会找到相同的消息
我很想知道是否有其他人遇到过这个问题,或者是否有我应该注意的已知问题?我很想尝试官方支持选项,但我不愿意尝试找一个真实的人,因为问题看起来很具体。