Целью одного из наших проектов был обработчик MS Exchange для обработки входящих сообщений электронной почты.
Основным источником знаний была статья Логу Кришнана «Разработка управляемых приемников / ловушек для Exchange Server Store с использованием C #», опубликованная на [http://www.codeproject.com/csharp/CsManagedEventSinksHooks.asp]а также примеры из Microsoft Exchange SDK.
Мы использовали синхронные события и создали обработчик, который запускается при событии OnSyncSave. Оператор создает запись активности в Microsoft CRM, а затем удаляет сообщение из базы данных Exchange перед фиксацией:
public void OnSyncSave (IExStoreEventInfo pEventInfo, string bstrURLItem, int IFlags) {
пытаться {
if (IFlags == ((int) EVT_SINK_FLAGS.EVT_SYNC_COMMITTED + (int) EVT_SINK_FLAGS.EVT_IS_DELIVERED)) {
ProcessMessage (pEventInfo, bstrURLItem, IFlags);
}
}
catch (Exception ex) {
log.Debug (например, Message + » n» + ex.StackTrace);
}
В заключение {
LogManager.Shutdown ();
}
}
При отладке обработчиков Exchange чрезвычайно удобно использовать log4net в RollingLogFileAppender или RemoteAppender (для нескольких экземпляров объектов COM +). Вы можете прочитать об этом здесь http://logging.apache.org/log4net/
Чтобы включить обработку входящей почты, необходимо предоставить пользователю соответствующие разрешения, с какой учетной записи приложение COM + запускает обработчик. Это права на изменение информации в почтовых ящиках пользователей, для которых они зарегистрированы (Windows 2003 Server: Active Directory Users and Computer -> Users -> Properties (для учетной записи приложения COM +) -> Exchange Advanced -> Mailbox rights) . А теперь код:
private void DeleteMessage (строка bstrURLItem) {
пытаться {
ADODB.Connection oCn = новый ADODB.Connection ();
oCn.Provider = «exoledb.datasource»;
oCn.Open (bstrURLItem, «», «», -1);
if (oCn.State == 1) {
log.Debug («Хорошее соединение»);
}
else {
log.Debug («Плохое соединение»);
}
ADODB.Record rec = новый ADODB.Record ();
rec.Open (bstrURLItem, oCn,
ADODB.ConnectModeEnum.adModeReadWrite,
ADODB.RecordCreateOptionsEnum.adFailIfNotExists,
ADODB.RecordOpenOptionsEnum.adOpenSource,
«», «»);
rec.DeleteRecord (bstrURLItem, ложь);
rec.Close ();
oCn.Close ();
rec = null;
oCn = ноль;
}
catch (Exception ex) {
log.Debug (например, Message + » n» + ex.StackTrace);
}
}
Удачной настройки!
Борис Макушкин