Outlook Interop для выполнения поиска на стороне сервера с несколькими фильтрами - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь использовать взаимодействие Outlook для извлечения всех электронных писем из папки «Входящие» с указанного адреса электронной почты отправителя и с указанным шаблоном подстановки, и у меня возникают проблемы при попытке применить два фильтра одновременно.

Первое, что меня беспокоит, - это где происходит фильтрация. Это на фильтре Exchange или на клиенте? Конечно, по соображениям производительности я бы хотел, чтобы фильтрация выполнялась на сервере. Я вижу два метода «Restict» и «Find», которые выглядят так, как будто они используются для фильтрации и что они принимают SQL -подобную строку фильтрации.

Я провел большую часть своего времени, пытаясь получить метод Restrict, и безуспешно пытался создать один фильтр с предложением «И», который выполняет фильтрацию как субъекта, так и отправителя. Я добился успеха, применив две последовательно соединенные функции Restrict подряд, как показано ниже, но я подозреваю, что фильтрация подобна LINQ и выполняется на клиенте. Это то, что здесь происходит? Разве я не могу объединить фильтр в одно составное предложение SQL WHERE?

Мне интересно, почему фильтр Subject, кажется, должен иметь префикс с помощью схемы, а фильтр отправителя, кажется, не принять тот же материал схемы. Кроме того, обратите внимание на два значения, назначенные senderEmailAddress (одно из них закомментировано). Я хотел бы фильтровать, используя стандартный SMPT-адрес, но, похоже, работает только адрес Exchange-Speci c. Есть какие-нибудь мысли?

Application oApp = new Application();
NameSpace oNS = oApp.GetNamespace("MAPI");
MAPIFolder inbox = oNS.GetDefaultFolder(OlDefaultFolders.olFolderInbox);

subject = "%Challenge%";
//senderEmailAddress = "FirstName.LastName@company.com"; 
senderEmailAddress = "/O=COMPANYNAME/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=LANID";
string senderFilter = $"[SenderEmailAddress] = '{senderEmailAddress}'";
string subjectFilter = $"@SQL=urn:schemas:httpmail:subject LIKE '{subject}'";            
var items = inbox.Items.Restrict(senderFilter).Restrict(subjectFilter);

В идеале я хотел бы найти ответ, который бы включал способ фильтрации по SMTP адресу электронной почты и тему с подстановочным знаком, на котором выполняется фильтрация. сервер. (Нет серверных циклов или LINQ-подобных методов, которые существенно делают одно и то же с одним оператором.)

Обновление 1

Я заметил, что могу фильтровать, используя свойство "fromemail" вместо senderemailAddress, как показано выше. Первый, похоже, требует префикса «схемы», а второй - нет. Не зная больше, я предполагаю, что существуют разные подходы с разным синтаксисом, но плохая часть заключается в том, что адрес электронной почты отправителя не соответствует формату, описанному выше.

$ "И urn: schemas : httpmail: fromemail LIKE '{fromEmail}' "

1 Ответ

0 голосов
/ 08 февраля 2020

К сожалению, у меня нет времени, чтобы попробовать это сам, но я надеюсь, что это все равно поможет. Согласно документам возможно использование фильтра с логическими операторами И, ИЛИ и НЕ. Вот пример запроса DASL с логическим оператором:

criteria = "@SQL=" & "(NOT(" _ 
& Chr(34) & "https://schemas.microsoft.com/mapi/string/" _ 
& "{00020329-0000-0000-C000-000000000046}/Order%20Date" & Chr(34) _ 
& " IS NULL) AND " _ & Chr(34) & "urn:schemas-microsoft-com:office:office#Company" 
& Chr(34) _ & " = 'Microsoft')"

Приведенный выше запрос извлекает все контакты, для которых настраиваемое свойство «Дата заказа» не равно нулю, а свойство CompanyName точно Microsoft.

Если вы уже попробовали это, вы можете проверить синтаксис снова. Мне кажется, вы должны быть особенно осторожны с побегами.

...