С помощью API MS Graph я могу видеть идентификатор электронной почты Outlook и устанавливать пользовательские свойства (расширенное свойство с одним значением — https://learn.microsoft.com/en-us/graph/api/singlevaluelegacyextendedproperty-post-singlevalueextendedproperties?view =graph-rest-1.0).
Есть ли способ найти конкретное электронное письмо, выполнив поиск по этому EmailID или пользовательскому свойству с помощью VBA? Не похоже, что я могу искать эти свойства с помощью «Folder.Items.Restrict()»
Кроме того, как только я получаю элемент электронной почты, я могу увидеть пользовательское свойство, которое я установил через MS Graph Api.
OItem.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/string/{10101010-1010-1010-C101-1010101010101010}/myCustomProp")
Но есть ли способ запросить папку «Входящие» и найти это конкретное письмо с помощью VBA?
Я пробовал использовать Restrict() и PropertyAccessor, но они, похоже, не решают мою проблему.
Вы можете использовать Items.Find/Restrict для поиска свойства по его имени DASL. Используйте запрос, например
@SQL = "http://schemas.microsoft.com/mapi/string/{10101010-1010-1010-C101-1010101010101010}/myCustomProp" = 'some value'
Обратите внимание, что имя DASL должно быть заключено в кавычки, поэтому в VBA оно будет
set item = SomeFolder.Items.Find("@SQL = ""http://schemas.microsoft.com/mapi/string/{10101010-1010-1010-C101-1010101010101010}/myCustomProp"" = 'some value'")
SomeFolder
означает экземпляр объекта MAPIFolder
. Вам нужно будет использовать соответствующее имя переменной.
Это выглядит хорошо для меня. Возвращает ошибку?
Спасибо за подтверждение правильности синтаксиса. Должно быть что-то еще, что вызывает сбой поиска. «Найти» не дает ошибки, он просто ничего не возвращает. oMail Ничего = Истина. Имя и значение свойства верны, поскольку я могу прочитать значение свойства с помощью «GetProperty».
Вы уверены, что имя свойства указано правильно и в папке «Входящие» есть элемент с этим набором свойств? Вы видите его в OutlookSpy (выберите сообщение и нажмите кнопку IMessage)?
При проверке в Outlook Spy в конец строки DASL для пользовательского свойства был добавлен 0x0000001F. Таким образом, поиск работает, когда я включил это. Выглядит так @SQL = "http://schemas.microsoft.com/mapi/string/{10101010-1010-1010-C101-1010101010101010}/myCustomProp/0x0000001F" = 'some value'. У вас есть идея, почему 0x0000001F нужно включить? В любом случае большое спасибо за помощь и предложения!!
0x001F
— это тип свойства, который означает PT_UNICODE
. Обычно Outlook не требует типа свойства для строковых свойств — он предполагает строку, если тип не указан.
Двоичные свойства (такие как EntryID и т. д.) не поддерживаются для поиска элементов в Outlook. Лучшее, что вы можете сделать, это искать элементы с пользовательским свойством. Например, вы можете использовать следующий фильтр для поиска пользовательского свойства под названием «Подарок мамы», которое содержит слово pearls:
filter = "@SQL = " & Chr(34) & _
"https://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/" _
& "Mom%27s%20%22Gift%22" & Chr(34) & " like '%pearls%'"
Обратите внимание, что мы использовали функцию Chr(34) для решения проблемы с двойными кавычками. Подробнее о сравнении строк читайте в статье Фильтрация элементов с помощью сравнения строк.
Для поиска элементов, соответствующих вашим условиям, в папке Outlook вы можете использовать методы Find/FindNext или Restrict класса Items. Подробнее о них можно прочитать в статьях, которые я написал для технического блога:
Но если вам нужно искать элементы в нескольких папках или подпапках, вы можете вместо этого использовать метод AdvancedSearch класса Application. Ключевые преимущества использования метода AdvancedSearch в Outlook:
AdvancedSearch
запускает его автоматически в фоновом режиме.Restrict
и Find
/FindNext
можно применять к конкретной коллекции Items
(см. свойство Items
класса Folder
в Outlook).IsInstantSearchEnabled
класса Store
).Stop
класса Search
.См. Расширенный поиск в Outlook программно: C#, VB.NET для получения дополнительной информации.
Привет! Спасибо за ответ! По какой-то причине «SomeFolder.Items.Find» возвращается как ничего/нуль.