Работа с папками поиска с помощью EWS в Exchange
Узнайте, как создавать, получать, обновлять и удалять папки поиска с помощью управляемого API EWS или EWS в Exchange.
Папка поиска представляет постоянный "всегда на" поиск в почтовом ящике пользователя. Папка поиска выглядит и действует как обычная папка почтовых ящиков. Однако вместо того, чтобы содержать элементы, он содержит "виртуальную" копию элементов из любых папок в области поиска, которые соответствуют критериям поиска, установленным в папке. И приложения, и конечные пользователи могут использовать папки поиска. Нужно ли приложению выполнять один и тот же поиск снова и снова? Папки поиска являются отличным средством для этой задачи. Или, возможно, вы просто хотите предоставить пользователям возможность доступа к папкам поиска в клиенте и управлять ими. Независимо от сценария, управляемый API EWS и EWS позволяют приложению полностью взаимодействовать с папками поиска.
Примечание
Эта статья применяется только при использовании Outlook в режиме online. Папки поиска не синхронизируются; Поэтому папки поиска, созданные в режиме онлайн, не будут отображаться в кэшном режиме.
Таблица 1. Методы управляемого API EWS и операции EWS для работы с папками поиска
Что требуется сделать | В управляемом API EWS, используйте... | В EWS используйте... |
---|---|---|
Создание папки поиска |
SearchFolder.Save |
Операция CreateFolder |
Получить папку поиска |
SearchFolder.Bind |
Операция GetFolder |
Обновление папки поиска |
SearchFolder.Update |
Операция UpdateFolder |
Удаление папки поиска |
SearchFolder.Delete |
Операция DeleteFolder |
Основные понятия, которые необходимо знать для работы с папками поиска
Прежде чем приступить к работе с папками поиска, необходимо ознакомиться с работой фильтров поиска. Папки поиска используют фильтры поиска для выражения своих критериев. Фильтры поиска для папок поиска построены таким же образом, как и фильтры поиска для операций поиска.
Создание папки поиска с помощью управляемого API EWS
В основном, вы создаете папку поиска с помощью управляемого API EWS таким же образом, как вы создаете обычную папку. Однако вместо использования класса Folderвы используете класс SearchFolderи установите свойство SearchParameters для настройки критериев поиска.
В следующем примере создается папка поиска для поиска всех сообщений в папке "Входящие" и ее подмостков, отправленных менеджером пользователя sadie@contoso.com. Папка создается в качестве ребенка папки "Папки поиска" в почтовом ящике пользователя.
Примечание
Вы можете создать папку поиска в качестве ребенка любой папки в почтовом ящике пользователя. Однако, если вы хотите, чтобы недавно созданная папка была добавлена в папки поиска в Outlook, создайте ее в известной папке "Папки поиска", используя значение SearchFolders из переоформления WellKnownFolderName.
В этом примере предполагается, что для объекта ExchangeService выполнена инициализация с допустимыми значениями в свойствах Credentials и Url.
using Microsoft.Exchange.WebServices.Data;
static void CreateSearchFolder(ExchangeService service)
{
// Create the folder.
SearchFolder searchFolder = new SearchFolder(service);
searchFolder.DisplayName = "From Manager";
// Create a search filter to express the criteria
// for the folder.
EmailAddress manager = new EmailAddress("sadie@contoso.com");
SearchFilter.IsEqualTo fromManagerFilter =
new SearchFilter.IsEqualTo(EmailMessageSchema.Sender, manager);
// Set the search filter.
searchFolder.SearchParameters.SearchFilter = fromManagerFilter;
// Set the folder to search.
searchFolder.SearchParameters.RootFolderIds.Add(WellKnownFolderName.Inbox);
// Set the search traversal. Deep will search all subfolders.
searchFolder.SearchParameters.Traversal = SearchFolderTraversal.Deep;
// Call Save to make the EWS call to create the folder.
searchFolder.Save(WellKnownFolderName.SearchFolders);
}
Создание папки поиска с помощью EWS
Если вы используете EWS, используйте операцию CreateFolder с элементом SearchFolder для создания папки поиска. В следующем примере запроса создается папка поиска для поиска всех сообщений в папке "Входящие" и ее подмостков, отправленных менеджером пользователя sadie@contoso.com. Папка создается в папке "Папки поиска" в почтовом ящике пользователя.
Примечание
Вы можете создать папку поиска в качестве ребенка любой папки в почтовом ящике пользователя. Однако если вы хотите, чтобы недавно созданная папка была добавлена в папки поиска в Outlook, создайте ее в хорошо известной папке "Папки поиска", используя значение searchfolders в атрибуте Id элемента DistinguishedFolderId.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Eastern Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:CreateFolder>
<m:ParentFolderId>
<t:DistinguishedFolderId Id="searchfolders" />
</m:ParentFolderId>
<m:Folders>
<t:SearchFolder>
<t:DisplayName>From Manager</t:DisplayName>
<t:SearchParameters Traversal="Deep">
<t:Restriction>
<t:IsEqualTo>
<t:FieldURI FieldURI="message:Sender" />
<t:FieldURIOrConstant>
<t:Constant Value="sadie@contoso.com" />
</t:FieldURIOrConstant>
</t:IsEqualTo>
</t:Restriction>
<t:BaseFolderIds>
<t:DistinguishedFolderId Id="inbox" />
</t:BaseFolderIds>
</t:SearchParameters>
</t:SearchFolder>
</m:Folders>
</m:CreateFolder>
</soap:Body>
</soap:Envelope>
Сервер отвечает сообщением CreateFolderResponse, которое включает значение ResponseCode NoError, которое указывает на успех.
Получить папку поиска с помощью управляемого API EWS
Чтобы найти папки поиска, используйте метод управляемого API ExchangeService.FindFolders EWS. Обратите внимание, однако, что нельзя ограничивать результаты только папками поиска; Это необходимо иметь в виду при обработке результатов. Чтобы получить папки поиска, используйте метод SearchFolder.Bind.
В следующем примере находятся первые 10 папок в папке "Папки поиска". Он проверяет, является ли каждая из них папкой поиска, и если да, она получает папку поиска и отображает, сколько целевых папок она ищет.
using Microsoft.Exchange.WebServices.Data;
static void GetSearchFolders(ExchangeService service)
{
FolderView folderView = new FolderView(10);
folderView.PropertySet = new PropertySet(FolderSchema.DisplayName);
try
{
FindFoldersResults findResults = service.FindFolders(WellKnownFolderName.SearchFolders, folderView);
foreach (Folder folder in findResults.Folders)
{
// You can't request only search folders in
// a FindFolders request, so other search folders might also be present.
if (folder is SearchFolder)
{
Console.WriteLine("{0} is a search folder.", folder.DisplayName);
// In order to access the SearchParameters property,
// you have to bind to the folder. SearchParameters are not
// returned in FindFolders results.
SearchFolder searchFolder = SearchFolder.Bind(service, folder.Id);
Console.WriteLine("Number of folders searched: {0}.",
searchFolder.SearchParameters.RootFolderIds.Count);
}
else
{
Console.WriteLine("{0} is NOT a search folder.", folder.DisplayName);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception while enumerating results: {0}", ex.Message);
}
}
Получить папку поиска с помощью EWS
Если вы используете EWS, используйте операцию FindFolder для поиска папок поиска и операцию GetFolder для получения папок поиска. Успешный ответ GetFolder для папки поиска будет содержать элемент SearchFolder. В следующем примере запроса находятся первые 10 папок в папке Папки поиска.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Eastern Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:FindFolder Traversal="Shallow">
<m:FolderShape>
<t:BaseShape>IdOnly</t:BaseShape>
<t:AdditionalProperties>
<t:FieldURI FieldURI="folder:DisplayName" />
</t:AdditionalProperties>
</m:FolderShape>
<m:IndexedPageFolderView MaxEntriesReturned="10" Offset="0" BasePoint="Beginning" />
<m:ParentFolderIds>
<t:DistinguishedFolderId Id="searchfolders" />
</m:ParentFolderIds>
</m:FindFolder>
</soap:Body>
</soap:Envelope>
Сервер возвращает следующий ответ, в котором показана одна папка поиска.
<?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="712" MinorBuildNumber="22" Version="V2_3"
xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types"
xmlns="https://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:FindFolderResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:FindFolderResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:RootFolder IndexedPagingOffset="3" TotalItemsInView="3" IncludesLastItemInRange="true">
<t:Folders>
<t:SearchFolder>
<t:FolderId Id="AAMkAGM2..." ChangeKey="CAAAABYA..." />
<t:DisplayName>From Manager</t:DisplayName>
</t:SearchFolder>
</t:Folders>
</m:RootFolder>
</m:FindFolderResponseMessage>
</m:ResponseMessages>
</m:FindFolderResponse>
</s:Body>
</s:Envelope>
В следующем примере запроса используется значение элемента FolderId из предыдущего ответа в запросе операции GetFolder для получения папки поиска.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Eastern Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:GetFolder>
<m:FolderShape>
<t:BaseShape>AllProperties</t:BaseShape>
</m:FolderShape>
<m:FolderIds>
<t:FolderId Id="AAMkAGM2..." ChangeKey="CAAAABYA..." />
</m:FolderIds>
</m:GetFolder>
</soap:Body>
</soap:Envelope>
Сервер возвращает следующий ответ со всеми свойствами первого класса для папки поиска.
<?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="712" MinorBuildNumber="22" Version="V2_3"
xmlns:h="https://schemas.microsoft.com/exchange/services/2006/types"
xmlns="https://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:GetFolderResponse xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
<m:ResponseMessages>
<m:GetFolderResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Folders>
<t:SearchFolder>
<t:FolderId Id="AAMkAGM2..." ChangeKey="CAAAABYA..." />
<t:ParentFolderId Id="AQMkAGM2..." ChangeKey="AQAAAA==" />
<t:FolderClass>IPF.Note</t:FolderClass>
<t:DisplayName>From Manager</t:DisplayName>
<t:TotalCount>8</t:TotalCount>
<t:ChildFolderCount>0</t:ChildFolderCount>
<t:EffectiveRights>
<t:CreateAssociated>true</t:CreateAssociated>
<t:CreateContents>true</t:CreateContents>
<t:CreateHierarchy>true</t:CreateHierarchy>
<t:Delete>true</t:Delete>
<t:Modify>true</t:Modify>
<t:Read>true</t:Read>
<t:ViewPrivateItems>true</t:ViewPrivateItems>
</t:EffectiveRights>
<t:UnreadCount>0</t:UnreadCount>
<t:SearchParameters Traversal="Deep">
<t:Restriction>
<t:IsEqualTo>
<t:FieldURI FieldURI="message:Sender" />
<t:FieldURIOrConstant>
<t:Constant Value="/o=First Organization/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=8d84a3f4cbb34d48838a3aecf99795c0-Sadie" />
</t:FieldURIOrConstant>
</t:IsEqualTo>
</t:Restriction>
<t:BaseFolderIds>
<t:FolderId Id="AQMkAGM2..." ChangeKey="AQAAAA==" />
</t:BaseFolderIds>
</t:SearchParameters>
</t:SearchFolder>
</m:Folders>
</m:GetFolderResponseMessage>
</m:ResponseMessages>
</m:GetFolderResponse>
</s:Body>
</s:Envelope>
Обновление папки поиска с помощью управляемого API EWS
Чтобы обновить папку поиска, используйте метод управляемого API EWS в объекте SearchFolder. В следующем примере обновляются критерии поиска в папке поиска с отображаемой именем "From Manager".
using Microsoft.Exchange.WebServices.Data;
static void UpdateSearchFolder(ExchangeService service)
{
FolderView folderView = new FolderView(10);
folderView.PropertySet = new PropertySet(FolderSchema.DisplayName);
try
{
FindFoldersResults findResults = service.FindFolders(WellKnownFolderName.SearchFolders, folderView);
foreach (Folder folder in findResults.Folders)
{
// You cannot request only search folders in
// a FindFolders request, so other search folders might also be present.
if (folder is SearchFolder && folder.DisplayName.Equals("From Manager"))
{
Console.WriteLine("\"{0}\" folder found.", folder.DisplayName);
SearchFolder searchFolder = folder as SearchFolder;
EmailAddress newManager = new EmailAddress("hope@contoso.com");
SearchFilter.IsEqualTo newManagerFilter =
new SearchFilter.IsEqualTo(EmailMessageSchema.Sender, newManager);
searchFolder.SearchParameters.SearchFilter = newManagerFilter;
searchFolder.SearchParameters.RootFolderIds.Add(WellKnownFolderName.Inbox);
searchFolder.SearchParameters.Traversal = SearchFolderTraversal.Deep;
searchFolder.Update();
Console.WriteLine("\"{0}\" folder updated.", folder.DisplayName);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception while enumerating results: {0}", ex.Message);
}
}
Обновление папки поиска с помощью EWS
Если вы используете EWS, используйте операцию UpdateFolder с элементом SearchFolder для обновления папки поиска. В следующем примере запроса обновляются критерии поиска в папке поиска "От менеджера".
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Eastern Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:UpdateFolder>
<m:FolderChanges>
<t:FolderChange>
<t:FolderId Id="AAMkAGM2..." ChangeKey="CAAAABYA..." />
<t:Updates>
<t:SetFolderField>
<t:FieldURI FieldURI="folder:SearchParameters" />
<t:SearchFolder>
<t:SearchParameters Traversal="Deep">
<t:Restriction>
<t:IsEqualTo>
<t:FieldURI FieldURI="message:Sender" />
<t:FieldURIOrConstant>
<t:Constant Value="hope@contoso.com" />
</t:FieldURIOrConstant>
</t:IsEqualTo>
</t:Restriction>
<t:BaseFolderIds>
<t:DistinguishedFolderId Id="inbox" />
</t:BaseFolderIds>
</t:SearchParameters>
</t:SearchFolder>
</t:SetFolderField>
</t:Updates>
</t:FolderChange>
</m:FolderChanges>
</m:UpdateFolder>
</soap:Body>
</soap:Envelope>
Сервер отвечает сообщением UpdateFolderResponse, которое включает значение ResponseCode NoError, которое указывает на успех.
Удаление папки поиска с помощью управляемого API EWS
Чтобы удалить папку поиска, используйте метод управляемого API EWS на объекте SearchFolder. В следующем примере удаляется папка поиска с отображаемой именем "From Manager". Удаленная папка поиска перемещается в папку "Удаленные элементы".
using Microsoft.Exchange.WebServices.Data;
static void DeleteSearchFolder(ExchangeService service)
{
FolderView folderView = new FolderView(10);
folderView.PropertySet = new PropertySet(FolderSchema.DisplayName);
try
{
FindFoldersResults findResults = service.FindFolders(WellKnownFolderName.SearchFolders, folderView);
foreach (Folder folder in findResults.Folders)
{
// You cannot request only search folders in
// a FindFolders request, so other folders might also be present.
if (folder is SearchFolder && folder.DisplayName.Equals("From Manager"))
{
Console.WriteLine("\"{0}\" folder found.", folder.DisplayName);
folder.Delete(DeleteMode.MoveToDeletedItems);
Console.WriteLine("\"{0}\" folder deleted.", folder.DisplayName);
}
}
}
catch (Exception ex)
{
Console.WriteLine("Exception while enumerating results: {0}", ex.Message);
}
}
Удаление папки поиска с помощью EWS
Если вы используете EWS, используйте операцию DeleteFolder для удаления папки поиска. В следующем примере удаляется папка поиска и перемещается в папку "Удаленные элементы".
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2007_SP1" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Id="Eastern Standard Time" />
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:DeleteFolder DeleteType="MoveToDeletedItems">
<m:FolderIds>
<t:FolderId Id="AAMkAGM2..." ChangeKey="CAAAABYA..." />
</m:FolderIds>
</m:DeleteFolder>
</soap:Body>
</soap:Envelope>
Сервер отвечает сообщением DeleteFolderResponse, которое включает значение ResponseCode NoError, которое указывает на успех.