2008-11-04 14 views
9

ShellExecute() me permet d'effectuer des tâches shell simples, permettant au système de prendre en charge l'ouverture ou l'impression de fichiers. Je veux adopter une approche similaire à l'envoi d'une pièce jointe par e-mail par programmation.Comment envoyer un e-mail par programme de la même manière que je peux "Envoyer au destinataire du message" dans l'Explorateur Windows?

Je ne veux pas manipuler directement Outlook, car je ne veux pas supposer quel client de messagerie l'utilisateur utilise par défaut. Je ne veux pas envoyer l'e-mail directement, car je souhaite que l'utilisateur ait la possibilité d'écrire le corps de l'e-mail en utilisant son client préféré. Ainsi, je veux vraiment accomplir exactement ce que Windows Explorer fait quand je fais un clic droit sur un fichier et sélectionne Send To -> Mail Recipient.

Je suis à la recherche d'une solution C++.

Répondre

8

C'est ma solution MAPI:

#include <tchar.h> 
#include <windows.h> 
#include <mapi.h> 
#include <mapix.h> 

int _tmain(int argc, wchar_t *argv[]) 
{ 
    HMODULE hMapiModule = LoadLibrary(_T("mapi32.dll")); 

    if (hMapiModule != NULL) 
    { 
     LPMAPIINITIALIZE lpfnMAPIInitialize = NULL; 
     LPMAPIUNINITIALIZE lpfnMAPIUninitialize = NULL; 
     LPMAPILOGONEX lpfnMAPILogonEx = NULL; 
     LPMAPISENDDOCUMENTS lpfnMAPISendDocuments = NULL; 
     LPMAPISESSION lplhSession = NULL; 

     lpfnMAPIInitialize = (LPMAPIINITIALIZE)GetProcAddress(hMapiModule, "MAPIInitialize"); 
     lpfnMAPIUninitialize = (LPMAPIUNINITIALIZE)GetProcAddress(hMapiModule, "MAPIUninitialize"); 
     lpfnMAPILogonEx = (LPMAPILOGONEX)GetProcAddress(hMapiModule, "MAPILogonEx"); 
     lpfnMAPISendDocuments = (LPMAPISENDDOCUMENTS)GetProcAddress(hMapiModule, "MAPISendDocuments"); 

     if (lpfnMAPIInitialize && lpfnMAPIUninitialize && lpfnMAPILogonEx && lpfnMAPISendDocuments) 
     { 
      HRESULT hr = (*lpfnMAPIInitialize)(NULL); 

      if (SUCCEEDED(hr)) 
      { 
       hr = (*lpfnMAPILogonEx)(0, NULL, NULL, MAPI_EXTENDED | MAPI_USE_DEFAULT, &lplhSession); 

       if (SUCCEEDED(hr)) 
       { 
        // this opens the email client with "C:\attachment.txt" as an attachment 
        hr = (*lpfnMAPISendDocuments)(0, ";", "C:\\attachment.txt", NULL, NULL); 

        if (SUCCEEDED(hr)) 
        { 
         hr = lplhSession->Logoff(0, 0, 0); 
         hr = lplhSession->Release(); 
         lplhSession = NULL; 
        } 
       } 
      } 

      (*lpfnMAPIUninitialize)(); 
     } 

     FreeLibrary(hMapiModule); 
    } 

    return 0; 
} 
+0

Comment puis-je configurer le destinataire (s)? – Tim

+0

Ce n'est pas une solution 100% programmatique. Ce code ouvre le client de messagerie avec le fichier fourni ajouté en pièce jointe. Il appartient ensuite à l'utilisateur de taper le (s) destinataire (s), comme il le ferait à tout autre moment. –

+0

Les en-têtes Outlook, y compris mapix.h, peuvent être téléchargés à partir de MSDN à l'emplacement suivant - https://www.microsoft.com/en-us/download/confirmation.aspx?id=12905 Cependant, je reçois une erreur lors de l'exécution de ce code, qui indique qu'un client de messagerie par défaut n'est pas installé. Mais je peux invoquer Outlook à partir de Windows Explorer en envoyant n'importe quel fichier à envoyer par courrier électronique. – armanali

2

Vous pouvez utiliser une commande "mailto:" standard dans le shell Windows. Il va exécuter le client de messagerie par défaut.

0

Vous aurez besoin de mettre en œuvre un MAPI client. Cela vous permettra de pré-remplir le document, ajouter des pièces jointes, etc. avant de présenter le message à l'utilisateur à envoyer. Vous pouvez utiliser le magasin de messages par défaut pour utiliser leur client de messagerie par défaut.