Extraire une entité d’un message électronique à l’aide d’EWS dans Exchange
Découvrez comment extraire des informations du corps d’un e-mail à l’aide de l’API managée EWS ou EWS dans Exchange.
Vous pouvez utiliser l’API managée EWS ou EWS pour accéder aux adresses, contacts, adresses e-mail, suggestions de réunion, numéros de téléphone, tâches et URL qu’un serveur Exchange extrait des messages électroniques. Vous pouvez ensuite utiliser ces informations pour de nouvelles applications ou pour suggérer des actions de suivi dans des applications existantes. Par exemple, si une entité contact, une suggestion de réunion ou une suggestion de tâche est identifiée dans un e-mail, votre application peut suggérer la création d’un nouvel élément avec des informations préremplies. En utilisant des entités extraites, vous pouvez tirer parti de l’intention derrière les données et aider les utilisateurs à intégrer en toute transparence le contenu de leurs messages électroniques dans des résultats actionnables.
L’extraction d’entités pour les adresses, les contacts, les adresses e-mail, les suggestions de réunion, les numéros de téléphone, les tâches et les URL est déjà intégrée à chaque élément du magasin Exchange. Si vous utilisez l’API managée EWS, la propriété Item.EntityExtractionResult récupère les entités pour vous dans un appel de méthode Item.Bind . Si vous utilisez EWS, l’élément EntityExtractionResult obtient toutes les entités extraites pour vous dans un appel d’opération GetItem . Après avoir récupéré les résultats des entités extraites, vous pouvez parcourir chaque collection d’entités pour collecter des informations pertinentes. Par exemple, si une suggestion de réunion a été extraite, vous pouvez récupérer l’objet de la réunion suggérée, la liste des participants, l’heure de début et l’heure de fin.
Tableau 1. Propriétés de l’API managée EWS et éléments EWS qui contiennent des entités extraites
Entité extraite | Propriété d’API managée EWS | Élément EWS |
---|---|---|
Adresses |
EntityExtractionResult.Addresses |
Adresses |
Contacts |
EntityExtractionResult.Contacts |
Contacts |
Adresses de messagerie |
EntityExtractionResult.EmailAddresses |
EmailAddresses |
Suggestions de réunion |
EntityExtractionResult.MeetingSuggestions |
MeetingSuggestions |
Numéros de téléphone |
EntityExtractionResult.PhoneNumbers |
PhoneNumbers |
Suggestions de tâches |
EntityExtractionResult.TaskSuggestions |
TaskSuggestions |
URL |
EntityExtractionResult.Urls |
URL |
Étant donné que l’extraction d’entités repose sur la reconnaissance du langage naturel, la reconnaissance des entités peut être non déterministe et le succès dépend parfois du contexte. Pour illustrer le fonctionnement de la reconnaissance en langage naturel, les exemples de cet article utilisent l’e-mail suivant comme entrée.
From: Ronnie Sturgis
To: Sadie Daniels
Subject: Dinner party
Hi Sadie
Are you free this Friday at 7 to join us for a dinner party at our house?
We're at 789 International Blvd, St Paul MN 55104.
Our number is 612-555-0158 if you have trouble finding it.
Please RSVP to either myself or Mara (mara@contoso.com) before Friday morning. Best for you organics (http://www.bestforyouorganics.com) will be catering so we can fully enjoy ourselves!
Also, can you forward this to Magdalena? I don't have her contact information.
See you then!
Ronnie
Extraire toutes les entités d’un e-mail à l’aide de l’API managée EWS
L’exemple de code suivant montre comment afficher toutes les entités extraites par le serveur, en utilisant la méthode Item.Bind , puis en énumérant chacune des entités extraites et leurs propriétés.
Cet exemple suppose que le service est un objet ExchangeService valide et que ItemId est l’ID du message électronique à déplacer ou copier.
public static void ExtractEntities(ExchangeService service, ItemId ItemId)
{
// Create a property set that limits the properties returned
// by the Bind method to only those that are required.
PropertySet propSet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.EntityExtractionResult);
// Get the item from the server.
// This method call results in an GetItem call to EWS.
Item item = Item.Bind(service, ItemId, propSet);
Console.WriteLine("The following entities have been extracted from the message:");
Console.WriteLine(" ");
// If address entities are extracted from the message, print the results.
if (item.EntityExtractionResult != null)
{
if (item.EntityExtractionResult.Addresses != null)
{
Console.WriteLine("--------------------Addresses---------------------------");
foreach (AddressEntity address in item.EntityExtractionResult.Addresses)
{
Console.WriteLine("Address: {0}", address.Address);
}
Console.WriteLine(" ");
}
// If contact entities are extracted from the message, print the results.
if (item.EntityExtractionResult.Contacts != null)
{
Console.WriteLine("--------------------Contacts----------------------------");
foreach (ContactEntity contact in item.EntityExtractionResult.Contacts)
{
Console.WriteLine("Addresses: {0}", contact.Addresses);
Console.WriteLine("Business name: {0}", contact.BusinessName);
Console.WriteLine("Contact string: {0}", contact.ContactString);
Console.WriteLine("Email addresses: {0}", contact.EmailAddresses);
Console.WriteLine("Person name: {0}", contact.PersonName);
Console.WriteLine("Phone numbers: {0}", contact.PhoneNumbers);
Console.WriteLine("URLs: {0}", contact.Urls);
}
Console.WriteLine(" ");
}
// If email address entities are extracted from the message, print the results.
if (item.EntityExtractionResult.EmailAddresses != null)
{
Console.WriteLine("--------------------Email addresses---------------------");
foreach (EmailAddressEntity email in item.EntityExtractionResult.EmailAddresses)
{
Console.WriteLine("Email addresses: {0}", email.EmailAddress);
}
Console.WriteLine(" ");
}
// If meeting suggestion entities are extracted from the message, print the results.
if (item.EntityExtractionResult.MeetingSuggestions != null)
{
Console.WriteLine("--------------------Meeting suggestions-----------------");
foreach (MeetingSuggestion meetingSuggestion in item.EntityExtractionResult.MeetingSuggestions)
{
Console.WriteLine("Meeting subject: {0}", meetingSuggestion.Subject);
Console.WriteLine("Meeting string: {0}", meetingSuggestion.MeetingString);
foreach (EmailUserEntity attendee in meetingSuggestion.Attendees)
{
Console.WriteLine("Attendee name: {0}", attendee.Name);
Console.WriteLine("Attendee user ID: {0}", attendee.UserId);
}
Console.WriteLine("Start time: {0}", meetingSuggestion.StartTime);
Console.WriteLine("End time: {0}", meetingSuggestion.EndTime);
Console.WriteLine("Location: {0}", meetingSuggestion.Location);
}
Console.WriteLine(" ");
}
// If phone number entities are extracted from the message, print the results.
if (item.EntityExtractionResult.PhoneNumbers != null)
{
Console.WriteLine("--------------------Phone numbers-----------------------");
foreach (PhoneEntity phone in item.EntityExtractionResult.PhoneNumbers)
{
Console.WriteLine("Original phone string: {0}", phone.OriginalPhoneString);
Console.WriteLine("Phone string: {0}", phone.PhoneString);
Console.WriteLine("Type: {0}", phone.Type);
}
Console.WriteLine(" ");
}
// If task suggestion entities are extracted from the message, print the results.
if (item.EntityExtractionResult.TaskSuggestions != null)
{
Console.WriteLine("--------------------Task suggestions--------------------");
foreach (TaskSuggestion task in item.EntityExtractionResult.TaskSuggestions)
{
foreach (EmailUserEntity assignee in task.Assignees)
{
Console.WriteLine("Assignee name: {0}", assignee.Name);
Console.WriteLine("Assignee user ID: {0}", assignee.UserId);
}
Console.WriteLine("Task string: {0}", task.TaskString);
}
Console.WriteLine(" ");
}
// If URL entities are extracted from the message, print the results.
if (item.EntityExtractionResult.Urls != null)
{
Console.WriteLine("--------------------URLs--------------------------------");
foreach (UrlEntity url in item.EntityExtractionResult.Urls)
{
Console.WriteLine("URL: {0}", url.Url);
}
Console.WriteLine(" ");
}
}
// If no entities are extracted from the message, print the result.
else if (item.EntityExtractionResult == null)
{
Console.WriteLine("No entities extracted");
}
}
La sortie suivante s’affiche sur la console.
The following entities have been extracted from the message:
--------------------Addresses---------------------------
Address: 789 International Blvd, St Paul MN 55104
--------------------Contacts----------------------------
Addresses:
Business name:
Contact string: Mara (mara@contoso.com)
Email addresses: mara@contoso.com
Person name: Mara
Phone numbers:
URLs:
--------------------Email addresses---------------------
Email addresses: mara@contoso.com
--------------------Meeting suggestions-----------------
Meeting subject: dinner party
Meeting string: Are you free this Friday at 7 to join us for a dinner party at our house?
Attendee name: Ronnie Sturgis
Attendee user ID: ronnie@contoso.com
Attendee name: Sadie Daniels
Attendee user ID: sadie@cntoso.com
Start time: 10/1/0104 2:00:00 PM
End time: 10/1/0104 2:30:00 PM
Location:
--------------------Phone numbers-----------------------
Original phone string: 612-555-0158
Phone string: 6125550158
Type: Unspecified
--------------------Task suggestions--------------------
Assignee name: Sadie Daniels
Assignee user ID: sadie@contoso.com
Task string: Also, can you forward this to Magdalena?
--------------------URLs--------------------------------
URL: http://www.bestforyouorganics.com
Notez que toutes les adresses, contacts, adresses e-mail, numéros de téléphone, tâches et URL ont été extraits comme prévu. La suggestion de réunion, cependant, est un peu plus complexe. Notez que l’heure de début et l’heure de fin de la suggestion de réunion ne sont pas ce à quoi vous pourriez vous attendre. L’heure de début dans l’e-mail est « ce vendredi à 7 », mais la valeur extraite pour l’heure de début est 10/10/0104 14:00:00 PM. Cela est dû au fait que l’heure de début et l’heure de fin extraites par le serveur sont des dates encodées. Pour plus d’informations sur l’interprétation des valeurs dateTime dans les suggestions de réunion, consultez [MS-OXCEXT] : Client Extension Message Object Protocol.
Extraire toutes les entités d’un e-mail à l’aide d’EWS
L’exemple de code suivant montre comment utiliser l’opération GetItem et l’élément EntityExtractionResult pour récupérer les entités extraites d’un élément.
Il s’agit également de la requête XML envoyée par l’API managée EWS lorsque vous utilisez la méthode Bind pour extraire toutes les entités d’un e-mail à l’aide de l’API managée EWS.
La valeur de l’élément ItemId est raccourcie pour plus de lisibilité.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2013" />
</soap:Header>
<soap:Body>
<m:GetItem>
<m:ItemShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="item:EntityExtractionResult" />
</t:AdditionalProperties>
</m:ItemShape>
<m:ItemIds>
<t:ItemId Id="sVC5AAA=" />
</m:ItemIds>
</m:GetItem>
</soap:Body>
</soap:Envelope>
Le serveur répond à la requête GetItem avec un message GetItemResponse qui inclut la valeur ResponseCodeNoError, ce qui indique que le message électronique a été récupéré avec succès. La réponse inclut également entityExtractionResult pour chaque entité extraite.
La valeur de l’élément ItemId est raccourcie pour plus de lisibilité.
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15"
MinorVersion="0"
MajorBuildNumber="883"
MinorBuildNumber="10"
Version="V2_10"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:Message>
<t:ItemId Id="sVC5AAA="
ChangeKey="CQAAABYAAAD32nSTjepyT63rYH17n9THAAAOOqJN" />
<t:EntityExtractionResult>
<t:Addresses>
<t:AddressEntity>
<t:Position>LatestReply</t:Position>
<t:Address>789 International Blvd, St Paul MN 55104</t:Address>
</t:AddressEntity>
</t:Addresses>
<t:MeetingSuggestions>
<t:MeetingSuggestion>
<t:Position>LatestReply</t:Position>
<t:Attendees>
<t:EmailUser>
<t:Name>Ronnie Sturgis</t:Name>
<t:UserId>ronnie@contoso.com</t:UserId>
</t:EmailUser>
<t:EmailUser>
<t:Name>Sadie Daniels</t:Name>
<t:UserId>sadie@contoso.com</t:UserId>
</t:EmailUser>
</t:Attendees>
<t:Subject>dinner party</t:Subject>
<t:MeetingString>Are you free this Friday at 7 to join us for a dinner party at our house?</t:MeetingString>
<t:StartTime>0104-10-01T19:00:00Z</t:StartTime>
<t:EndTime>0104-10-01T19:30:00Z</t:EndTime>
</t:MeetingSuggestion>
</t:MeetingSuggestions>
<t:TaskSuggestions>
<t:TaskSuggestion>
<t:Position>LatestReply</t:Position>
<t:TaskString>Also, can you forward this to Magdalena?</t:TaskString>
<t:Assignees>
<t:EmailUser>
<t:Name>Sadie Daniels</t:Name>
<t:UserId>sadie@contoso.com</t:UserId>
</t:EmailUser>
</t:Assignees>
</t:TaskSuggestion>
</t:TaskSuggestions>
<t:EmailAddresses>
<t:EmailAddressEntity>
<t:Position>LatestReply</t:Position>
<t:EmailAddress>mara@contoso.com</t:EmailAddress>
</t:EmailAddressEntity>
</t:EmailAddresses>
<t:Contacts>
<t:Contact>
<t:Position>LatestReply</t:Position>
<t:PersonName>Mara</t:PersonName>
<t:EmailAddresses>
<t:EmailAddress>mara@contoso.com</t:EmailAddress>
</t:EmailAddresses>
<t:ContactString>Mara (mara@contoso.com</t:ContactString>
</t:Contact>
</t:Contacts>
<t:Urls>
<t:UrlEntity>
<t:Position>LatestReply</t:Position>
<t:Url>http://www.bestforyouorganics.com</t:Url>
</t:UrlEntity>
</t:Urls>
<t:PhoneNumbers>
<t:Phone>
<t:Position>LatestReply</t:Position>
<t:OriginalPhoneString>612-555-0158</t:OriginalPhoneString>
<t:PhoneString>6125550158</t:PhoneString>
<t:Type>Unspecified</t:Type>
</t:Phone>
</t:PhoneNumbers>
</t:EntityExtractionResult>
</t:Message>
</m:Items>
</m:GetItemResponseMessage>
</m:ResponseMessages>
</m:GetItemResponse>
</s:Body>
</s:Envelope>
Notez que toutes les adresses, contacts, adresses e-mail, numéros de téléphone, tâches et URL ont été extraits comme prévu. La suggestion de réunion, cependant, est un peu plus complexe. Notez que l’heure de début et l’heure de fin de la suggestion de réunion ne sont pas ce à quoi vous pourriez vous attendre. L’heure de début dans l’e-mail était « ce vendredi à 7 », mais la valeur extraite pour l’heure de début est 10/10/0104 14:00:00 PM. Cela est dû au fait que l’heure de début et l’heure de fin extraites par le serveur sont des dates encodées. Pour plus d’informations sur l’interprétation des valeurs dateTime dans les suggestions de réunion, consultez [MS-OXCEXT] : Client Extension Message Object Protocol.