Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как заставить работать CMC (MAPI)? Проблемы с использованием почты 
:(
    Опции темы
valent_N
Дата 8.10.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 9.8.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Здравствуйте!
Мне нужно обеспечить моей C++-программе (MFC), разрабатываемой под MS Windows XP Home в среде MS Visual Studio 2005 Team Suite, некоторые из почтовых возможностей. Я выбрал для этого CMC (Common Messaging Calls) - программный интерфейс, базирующийся на MAPI-интерфейсе. В соответствии с документацией MSDN Library 2005 и представленными в ней образцами кодов я делаю следующую инициализацию CMC-интерфейса: 1) загрузка DLL (функция LoadLibrary); 2) выборка из DLL указателей на CMC-функции (метод GetCmcFunctionPtrs). А затем вызываю эти функции. Привожу соответствующий код из моей пробной программы (при создании проекта AppWizard'ом был помечен флажок, указывающий на использование MAPI):

Код

CMainFrame::CMainFrame()
{
    // TODO: add member initialization code here
    g_hMapi32Dll = LoadLibrary("Mapi32.dll");
    GetCmcFunctionPtrs();
    CMC_return_code Status = CMC_SUCCESS; // CMC_SUCCESS = 0
    if(g_cmc_query_configuration_FuncPtr != NULL)
    {
        CMC_boolean UI_available;   /* True if an interface is allowed */
        Status = g_cmc_query_configuration_FuncPtr(
      (CMC_session_id)0,                            /* No session handle*/
      (CMC_enum)CMC_CONFIG_UI_AVAIL,    /* See if UI is available.*/
      (CMC_buffer)&UI_available,            /* Return value*/
      (CMC_extension FAR *)NULL);            /* No extensions*/
    };
    if(g_cmc_logon_FuncPtr != NULL)
    {
        Status = CMC_SUCCESS;
        Status = g_cmc_logon_FuncPtr(NULL,NULL,TEXT("+*z/:k;#"),
            NULL,0,CMC_VERSION,CMC_LOGON_UI_ALLOWED | CMC_ERROR_UI_ALLOWED,
            &g_Session,NULL);
    };
}

CMainFrame::~CMainFrame()
{
    if(g_cmc_logoff_FuncPtr != NULL) g_cmc_logoff_FuncPtr(g_Session,0,0,NULL);
    if(g_hMapi32Dll != NULL) FreeLibrary(g_hMapi32Dll);
}

void CMainFrame::GetCmcFunctionPtrs(void)
{
    if(g_hMapi32Dll != NULL)
    {
        g_cmc_query_configuration_FuncPtr = (cmc_query_configuration_FuncPtr)
            GetProcAddress(g_hMapi32Dll,TEXT("cmc_query_configuration"));
        g_cmc_logon_FuncPtr = (cmc_logon_FuncType) GetProcAddress(g_hMapi32Dll,
            TEXT("cmc_logon"));
        g_cmc_logoff_FuncPtr = (cmc_logoff_FuncType) GetProcAddress(g_hMapi32Dll,
            TEXT("cmc_logoff"));
        g_cmc_free_FuncPtr = (cmc_free_FuncType) GetProcAddress(g_hMapi32Dll,
            TEXT("cmc_free"));
        g_cmc_look_up_FuncPtr = (cmc_look_up_FuncType) GetProcAddress(g_hMapi32Dll,
            TEXT("cmc_look_up"));
    }
    else
    {
        g_cmc_query_configuration_FuncPtr = NULL;
        g_cmc_logon_FuncPtr = NULL;
        g_cmc_logoff_FuncPtr = NULL;
        g_cmc_free_FuncPtr = NULL;
        g_cmc_look_up_FuncPtr = NULL;
    };
}



Однако обе вызываемые функции (g_cmc_query_configuration_FuncPtr и g_cmc_logon_FuncPtr) не срабатывают и возвращают значение CMC_E_FAILURE. В связи с вышеизложенным, имею вопросы к тем, кто имел успешный опыт работы с CMC или MAPI:

1. Нужны ли какие-либо предварительные меры по инсталляции MAPI? (В документации об этом ничего не говорится и можно понять, что ничего делать не нужно. Как я понимаю - лишь бы были провайдеры почтовых услуг, а Mapi32.dll является обязательной компонентой ОС Windows).

2. Достаточно ли для использования CMC только загрузить Mapi32.dll и получить из нее указатели на нужные функции?

3. Что в вышеприведенном коде делается неправильно?

Спасибо!

PM MAIL   Вверх
Dragon
Дата 8.10.2006, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 10.8.2006
Где: Киев

Репутация: нет
Всего: нет



Сколько себя помню, MAPI всегда работало отвратительно. Ее реализация зависит от правильной установки/конфигурации Outlook Express или Microsoft Outlook (если установлено). Насколько расширенные возможности почты нужны?

Вообще-то, реализация минимального SNMP с помощью сокетов занимает не более 100 строк кода. Причем кроссплатформенного кода, не зависящего от настроек среды. В некоторых случаях (в основном технических) даже не нужно получать MX записи на DNS сервере. 

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


Это сообщение отредактировал(а) Dragon - 8.10.2006, 12:54
PM MAIL ICQ   Вверх
valent_N
Дата 8.10.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 9.8.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Большое Спасибо за внимание к моему вопросу. Буду благодарен за присылку Вашего примера. Я не силен в сетевых протоколах, но мне казалось, что SNMP не подходит мне для моих целей. Очевидно, я ошибаюсь.

Вообще говоря, моя задача такая: нужно принять почту (Именно почту! А не создать  агентов, обменивающихся сообщениями в произвольном формате), посланную с судна программным обеспечением, созданным не мною, а американцами. То есть, я должен принять их правила игры. Почту я должен раздраконить по полной программе (реализовав абсолютно все почтовые протоколы, нужные для приема посланий) - сделать необходимые перекодировки (языковые и прочие), проанализировать по всем заголовкам, вытянуть все аттачменты, а затем проанализировать каждый из них, исходя из их форматов (XML, CSV, ...) и записать извлеченные из аттачментов данные в базу данных. Конечно, я мог бы прием почты и все протоколы реализовать сам своими руками. Когда-то я имел дело с SMTP и всеми другими почтовыми протоколами (тоже нужны были все они тогда) для реализации отправки почты и помню, насколько для меня это было тогда муторно. Чтобы этого избежать и сэкономить время, я решил сейчас использовать высокоуровневую поддержку почтовых возможностей, предоставляемую Microsoft'ом. Да и нет этого времени у меня сейчас.
PM MAIL   Вверх
Dragon
Дата 8.10.2006, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 10.8.2006
Где: Киев

Репутация: нет
Всего: нет



Понятно, тогда имеющийся пример не подойдет. По какой-то причине я счел что приложение должно отправлять e-mail, а не принимать.

Для приема тебе понадобится поддержка POP3 и IMAP Работа с аттачментами в контектсе e-mail сводится только к их приему smile Потому про парсинг пока можно забыть.

Т.е. да, если не использовать внешние библиотеки, тебе нужно чуть ли не mail server писать...
В общем, я сталкивался с MAPI около 3 лет назад и был крайне недоволен работой библиотеки. Судя по примеру кода, текущее положение вещей не сильно изменилось. На твоем месте я постарался бы найти альтернативы MAPI.

PM MAIL ICQ   Вверх
valent_N
Дата 8.10.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 9.8.2003
Где: Рига, Латвия

Репутация: нет
Всего: 1



Спасибо! Буду прорубать и CMC/MAPI. И буду также попутно искать другие возможности.
PM MAIL   Вверх
VSergeyV
Дата 5.12.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 299
Регистрация: 9.5.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Цитата(valent_N @  8.10.2006,  20:00 Найти цитируемый пост)
Спасибо! Буду прорубать и CMC/MAPI. И буду также попутно искать другие возможности.

И что же нашли и выбрали?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.