Как мне получить список всех адресов электронной почты для общих папок обмена?
Отвечает самостоятельно, примет наилучший ответ.
В то время как то, что вы разместили в качестве собственного ответа, будет работать, это поможет прочитать документацию по методам и объектам, которые вы используете, чтобы понять их ограничения. Если вы несколько раз вызывали этот код, у вас в конце концов была бы утечка памяти на ваших руках. Оператор foreach
не вызывает Dispose()
для используемого объекта, а только созданный им перечислитель. Ниже приведен несколько более эффективный метод поиска в каталоге (хотя очень небольшая проверка ошибок и обработка исключений).
public static void GetPublicFolderList()
{
DirectoryEntry entry = new DirectoryEntry("LDAP://sorcogruppen.no");
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.Filter = "(&(objectClass=publicfolder))";
// Request the mail attribute only to reduce the ammount of traffic
// between a DC and the application.
mySearcher.PropertiesToLoad.Add("mail");
// See Note 1
//mySearcher.SizeLimit = int.MaxValue;
// No point in requesting all of them at once, it'll page through
// all of them for you.
mySearcher.PageSize = 100;
// Wrap in a using so the object gets disposed properly.
// (See Note 2)
using (SearchResultCollection searchResults = mySearcher.FindAll())
{
foreach (SearchResult resEnt in searchResults)
{
// Make sure the mail attribute is provided and that there
// is actually data provided.
if (resEnt.Properties["mail"] != null
&& resEnt.Properties["mail"].Count > 0)
{
string email = resEnt.Properties["mail"][0] as string;
if (!String.IsNullOrEmpty(email))
{
// Do something with the email address
// for the public folder.
}
}
}
}
}
Замечания для DirectorySearcher.SizeLimit показывают, что ограничение размера игнорируется, если оно выше заданного по умолчанию (1000 записей), Пейджинг позволяет вам получить все нужные вам записи, когда вам это нужно.
В примечаниях к DirectorySearcher.FindAll() упоминается, что для поиска ресурсов необходимо утилизировать SearchResultCollection. Обертка его в выражении using
четко определяет ваше намерение как программиста.
Если вы используете Exchange 2007 или 2010, вы также можете установить средства управления Exchange и использовать командлеты powershell для запроса ваших общих папок. Вы можете прагматически создать рабочую среду powershell и вызвать командлеты Exchange напрямую, не требуя при этом консоли для взаимодействия с пользователем.
Следующий код получит список всех адресов электронной почты общих папок в обмен.
public static void GetPublicFolderList()
{
DirectoryEntry entry = new DirectoryEntry("LDAP://FakeDomain.com");
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.Filter = "(&(objectClass=publicfolder))";
mySearcher.SizeLimit = int.MaxValue;
mySearcher.PageSize = int.MaxValue;
foreach (SearchResult resEnt in mySearcher.FindAll())
{
if (resEnt.Properties.Count == 1)
continue;
object OO = resEnt.Properties["mail"][0];
}
}
Если вы хотите все адреса электронной почты общей папки,
удалить:
object OO = resEnt.Properties["mail"][0];
Добавить: for (int counter = 0; counter < resEnt.Properties [ "proxyAddresses" ]. Count; counter ++)
{
string Email = (string)resEnt.Properties["proxyAddresses"][counter];
if (Email.ToUpper().StartsWith("SMTP:"))
{
Email = Email.Remove(0, "SMTP:".Length);
}
}