2009-01-27 7 views
2

J'essaie d'utiliser SimpleMAPI pour afficher un dialogue 'écrire un message' avec une pièce jointe sur Vista SP1 avec Windows Mail ou Thunderbird dans une application C++ (Borland C++ Builder 2006). Je devrais être en mesure d'utiliser MAPISendMail pour ce faire.C++ SimpleMAPI SendMail échoue toujours?

Je ne remplis pas une adresse de destinataire car je m'attends à ce que l'utilisateur le fasse lorsque le client de messagerie affiche une boîte de dialogue 'Ecrire un message'. Je ne remplis pas non plus une adresse d'expéditeur car je m'attends à ce que le client de messagerie utilise la valeur par défaut. J'ai essayé de les coder en dur pour voir si c'est le problème et ce n'est pas le cas.

Mon code ressemble à ceci:

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 
} 

Il échoue toujours avec le code d'erreur 2 (MAPI_E_FAILURE). Qu'est-ce que je fais mal?

Merci beaucoup à l'avance.

Répondre

-2

Vous devez d'abord l'ouverture de session à la session MAPI

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

alors, vous pouvez appeler SendMail(). Et après cela, vous devez à nouveau la fermeture de session:

lpMapiLogoff(hMapiSession, NULL, 0, 0); 
+0

Stefan: Merci, mais cela ne fonctionne pas. MAPILogon renvoie également un code d'erreur de 2. Et je pensais que vous n'avez pas besoin d'appeler MAPILogon si vous transmettez MAPI_LOGON_UI à MAPISendMail. – QAZ

+0

Il existe plusieurs implémentations MAPI différentes. Vous n'avez pas besoin d'appeler MAPILogon pour le MAPI Outlook. Mais vous devez le faire avec le Thunderbird MAPI (au moins pour la version 1, jamais testé avec des versions ultérieures). La mise en œuvre d'Othere pourrait également l'exiger. – Stefan

0

message.lpRecips = NULL; // nous ne savons pas l'adresse du destinataire (s)

Essayez assinging lpRecips et le mettre est lpszAddress à « SMTP: »

2

L'utilisation similaire en Delphi et a découvert que cela ne fonctionne pas à l'intérieur d'un fil . (Composant Delphi TThread) J'ai utilisé exactement le même code et l'appel à l'intérieur du thread a toujours échoué, même si j'ai utilisé la synchronisation

Questions connexes