Мне нужно получить адреса электронной почты членов списка рассылки Outlook. Этого списка нет в моей локальной папке, это общий список компании.
У меня есть решение, но оно требует значительного количества времени, потому что я перебираю все существующие группы (8400+), чтобы найти нужную группу, прежде чем обрабатывать членов этой группы.
Есть ли лучший способ получить членов списка рассылки, если я уже знаю его имя (не нужно также получать все остальные 8400+ списков рассылки)?
Вот мой код:
outlookApp = New Outlook.Application
outlookNamespace = _outlookApp.GetNamespace("mapi")
Dim addrLists As Outlook.AddressLists =
outlookApp.Session.AddressLists
Dim root As Outlook.AddressList =
addrLists.OfType(Of Outlook.AddressList) _
.FirstOrDefault(Function(x) x.Name = "All Groups")
Dim entry As Outlook.AddressEntry =
root.AddressEntries.Cast(Of Outlook.AddressEntry) _
.FirstOrDefault(Function(x) x.Name = "<Enter Group Name Here>")
entry.Members
содержит всех членов этого списка.
Я пытался использовать функцию GetAddressEntryFromID
, но получаю только ошибку "К сожалению, возникла проблема. Вы можете попробовать еще раз". (перевод с немецкого).
Я нашел это сам.
Dim rec As Outlook.Recipient =
outlookNamespace.CreateRecipient("<Enter Group Name Here>")
rec.Resolve
rec.AddressEntry.Members
содержит всех членов списка.
Ваше решение работает, но зависит от наличия списка под названием «Все группы». Всегда ли так в любой языковой версии Outlook?
К сожалению, иногда Resolve
не работал, хотя данное имя группы действительно существует, поэтому я снова переключился на другой способ и проверил, соответствует ли найденное имя группы заданному имени группы, чтобы узнать, действительно ли существует данная группа.
Да, название «Все группы» локализовано, но, к сожалению, нет специального тега, который идентифицирует его как таковой. Единственный список, который это делает, это «Все комнаты».
Это намного проще:
set allGroups = Application.Session.AddressLists.Item("All Groups")
set addressEntry = allGroups.AddressEntries.Item("<Enter Group Name Here>")
for each m in addressEntry.Members
MsgBox m.Name
next
Всегда ли существует список адресов «все группы» в любой языковой версии Outlook? В противном случае мое решение не зависит от знания конкретного имени языка списка «все группы» для работы?
Кроме того, если вы используете allGroups.AddressEntries.Item
с именем списка, которого не существует, то он доставляет другой AddressEntry
с именем, похожим на то, которое вы искали. Я попытался получить несуществующий список «Хорст» и вместо этого получил список «ХОС». Используя мое решение, я могу использовать rec.Resolved
, чтобы проверить, действительно ли мой получатель существует.
Нет абсолютно никакой причины использовать CreateRecipient (что может привести к неоднозначным ошибкам имени) — у вас уже есть объект AddressEntry.