2013-02-14 5 views
1

Мне было поручено создать приложение, которое проверяет электронную почту с помощью MAPI. Я использовал код wrapper class, закодированный в cpp, к которому обращается C#. Я понимаю, что сочетание управляемого и неуправляемого кода не обязательно является лучшим путем, но это то, что я мог бы приступить к работе.Использование MAPI для доступа к серверу Exchange с помощью службы

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

клиент требует от нас использовать MAPI, и с помощью Outlook 2007, но я хотел бы, чтобы он был совместим с архитектурой x86 и x64. Отдельной программе, работающей на нескольких рабочих станциях, будет разрешено отправлять почту с использованием одного адреса электронной почты. Служба будет следить за этой учетной записью, наблюдая за новым письмом от Exchange, говоря, что сообщение не может быть доставлено. Когда это произойдет, он сделает заметку в базе данных для будущей коррекции.

Мое понимание того, как работает расширенный MAPI, заключается в том, что он использует профиль пользователя, который зарегистрировался для доступа к Exchange Server. Мой вопрос заключается в том, можно ли получить доступ к серверу Exchange через MAPI, когда никто не войдет в систему? Если это невозможно, позволяет OOM разрешить доступ к определенной учетной записи электронной почты (или профилю), когда ни один пользователь не вошел в систему? Будет ли один метод лучше, чем другой, если вы используете C#?

Ниже приведен краткий пример того, как входит в класс класса-оболочки. Я добавил второй метод, но никогда не получал его для входа в профиль, отличный от профиля текущего пользователя.

BOOL CMAPIEx::Login(LPCTSTR szProfileName, BOOL bInitAsService) 
{ 
    DWORD dwFlags=MAPI_EXTENDED | MAPI_USE_DEFAULT | MAPI_NEW_SESSION; 
    if(bInitAsService) dwFlags|=MAPI_EXPLICIT_PROFILE | MAPI_NT_SERVICE; 
    return (MAPILogonEx(NULL, (LPTSTR)szProfileName, NULL, dwFlags, &m_pSession)==S_OK); 
} 

BOOL CMAPIEx::Login(LPCTSTR szProfileName, LPCTSTR szProfilePassword, BOOL bInitAsService) 
{ 
    DWORD dwFlags=MAPI_EXTENDED | MAPI_EXPLICIT_PROFILE | MAPI_NEW_SESSION; 
    if(bInitAsService) 
     dwFlags|= MAPI_NT_SERVICE; 
    return (MAPILogonEx(NULL, (LPTSTR)szProfileName, (LPTSTR)szProfilePassword, dwFlags, &m_pSession)==S_OK); 
} 

Благодарим за любые предложения.

+0

Рассматривали ли вы использование обменных веб-сервисов вместо того, чтобы полагаться на профиль в среде выполнения? У этого есть управляемая .net-оболочка, которая делает его очень легким в работе. – sasfrog

ответ

2

Вы можете динамически создавать временный профиль с помощью службы MSEMS и настраивать ее.
См. http://support.microsoft.com/kb/306962?wa=wsignin1.0 и перейдите к «Использовать интерфейс IProfAdmin MAPI»
Убедитесь, что служба работает под идентификатором владельца почтового ящика.

+0

Это отличное предложение, но для меня это не сработало, как я думал. Я вхожу в систему на уровне пользователя, поэтому у меня есть доступ к профилю, связанному с учетной записью. Я считаю, что этот профиль уже должен быть создан и связан с ним. – Tim

+0

Если вы регистрируетесь как пользователь домена, который имеет местные права и имеет профиль, созданный на компьютере, на котором работает ваша служба, вы можете просто использовать MAPILogonEx для входа в существующий профиль. Просто убедитесь, что ваша служба запущена как пользователь домена, которому принадлежит основной почтовый ящик в профиле, и у этого пользователя домена настроен профиль локального Outlook. –

+0

Отметить это как снова решенное. Дмитрий фактически решил его здесь: http://social.msdn.microsoft.com/Forums/en-US/outlookdev/thread/7a9cc40a-ffd6-4f83-9973-5410615b4df4 – Tim

Смежные вопросы