C++ SimpleMAPI SendMail всегда терпит неудачу?
Я пытаюсь использовать SimpleMAPI для отображения диалога "написать сообщение" с вложением в Vista SP1 с Windows Mail или Thunderbird в приложении C++ (Borland C++ Builder 2006). Я должен иметь возможность использовать MAPISendMail для этого.
Я не заполняю адрес получателя, поскольку ожидаю, что пользователь сделает это, когда почтовый клиент отобразит диалоговое окно "Написать сообщение". Я также не заполняю адрес отправителя, поскольку ожидаю, что почтовый клиент будет использовать значение по умолчанию. Я попытался жестко их кодировать, чтобы увидеть, если это проблема, и это не так.
Мой код выглядит так:
HINSTANCE hMAPI;
LPMAPISENDMAIL pSendMail;
MapiMessage message;
MapiFileDesc file;
ZeroMemory( &message, sizeof( MapiMessage ) );
ZeroMemory( &file, sizeof( MapiFileDesc ) );
hMAPI = LoadLibraryA( "MAPI32.DLL" );
pSendMail = (LPMAPISENDMAIL)GetProcAddress( hMAPI, "MAPISendMail" );
// setup the attachment...
file.nPosition = -1;
file.lpszPathName = "C:\\my_attachment.dat";
// set up the message...
message.lpszSubject = "My Subject";
message.lpszNoteText = "My Message...";
message.lpszMessageType = "";
message.nRecipCount = 0;
message.lpRecips = NULL; // we don't know the recipient address(s)
message.nFileCount = 1;
message.lpFiles = &file;
message.lpOriginator = NULL; // we don't know the users from address
dwResult = pSendMail( lhSessionNull, (DWORD)Application->Handle, &message, MAPI_LOGON_UI | MAPI_DIALOG, 0 );
if( dwResult == SUCCESS_SUCCESS )
{
// ...yay! :)
}
else
{
// ...we always fail here with: MAPI_E_FAILURE
}
Всегда происходит сбой с кодом ошибки 2 (MAPI_E_FAILURE). Что я делаю неправильно?
Спасибо заранее.
4 ответа
Используя аналог в Delphi и обнаружил, что он не работает изнутри потока. (Компонент Delphi TThread) Я использовал один и тот же код, и вызов внутри потока всегда завершался неудачей, хотя я использовал синхронизацию
Это может вас заинтересовать:
Вы пробовали код с закрытым почтовым клиентом?
message.lpRecips = NULL; // мы не знаем адрес (а) получателя
Попробуйте назначить lpRecips и установить для его lpszAddress значение "SMTP:"
Вы должны сначала войти в сеанс MAPI
LHANDLE hMapiSession;
status = lpMapiLogon(NULL, NULL, NULL, MAPI_NEW_SESSION | MAPI_LOGON_UI, 0, &hMapiSession);
Затем вы можете вызвать SendMail(). И после этого вам нужно снова выйти из системы:
lpMapiLogoff(hMapiSession, NULL, 0, 0);