C ++ SimpleMAPI SendMail всегда терпит неудачу? - PullRequest
3 голосов
/ 27 января 2009

Я пытаюсь использовать 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 ]

2 голосов
/ 12 ноября 2009

Используя аналог в Delphi и обнаружил, что он не работает изнутри потока. (Компонент Delphi TThread) Я использовал один и тот же код, и вызов внутри потока всегда завершался неудачей, хотя я использовал синхронизацию

2 голосов
/ 29 января 2009

Это может вас заинтересовать:

http://groups.google.com/group/microsoft.public.win32.programmer.messaging/browse_thread/thread/a601e68b95f20609/f0b0d80c99d4eba7?lnk=gst&q=Vista+Outlook+2007#f0b0d80c99d4eba7

Вы пробовали код с закрытым почтовым клиентом?

0 голосов
/ 12 октября 2009

message.lpRecips = NULL; // мы не знаем адрес (а) получателя

Попробуйте ввести lpRecips и установить для его lpszAddress значение "SMTP:"

0 голосов
/ 27 января 2009

Вы должны сначала войти в сеанс MAPI

LHANDLE hMapiSession;
status = lpMapiLogon(NULL, NULL, NULL, MAPI_NEW_SESSION | MAPI_LOGON_UI, 0, &hMapiSession);

тогда вы можете вызвать SendMail (). И после этого вам нужно снова выйти из системы:

lpMapiLogoff(hMapiSession, NULL, 0, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...