2008-11-04 10 views
9

ShellExecute() me permite realizar tareas de shell simples, lo que permite que el sistema se encargue de abrir o imprimir archivos. Quiero adoptar un enfoque similar para enviar un archivo adjunto de correo electrónico mediante programación.¿Cómo envío un mensaje de correo electrónico de la misma manera que puedo "Enviar a un destinatario de correo" en el Explorador de Windows?

No quiero manipular Outlook directamente, ya que no quiero suponer qué cliente de correo electrónico utiliza el usuario de manera predeterminada. No deseo enviar el correo electrónico directamente, ya que quiero que el usuario tenga la oportunidad de escribir el cuerpo del correo electrónico utilizando su cliente preferido. Por lo tanto, realmente quiero lograr exactamente lo que hace Windows Explorer cuando hago clic derecho en un archivo y selecciono Enviar a -> Destinatario de correo.

Estoy buscando una solución C++.

Respuesta

8

Esta es mi solución 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

¿Cómo se configura el destinatario (s)? – Tim

+0

Esto no es una solución 100% programática. Este código abre el cliente de correo electrónico con el archivo proporcionado agregado como un archivo adjunto. Depende del usuario escribir los destinatarios, tal como lo harían en cualquier otro momento. –

+0

Los encabezados de Outlook, incluido mapix.h, pueden descargarse de MSDN en la siguiente ubicación: https://www.microsoft.com/en-us/download/confirmation.aspx?id=12905 Yo, sin embargo, estoy obteniendo un error al ejecutar este código, que dice que no está instalado un cliente de correo electrónico predeterminado. Pero puedo invocar Outlook desde el Explorador de Windows enviando cualquier archivo al correo electrónico. – armanali

2

Puede usar un comando estándar "mailto:" en el shell de Windows. Ejecutará el cliente de correo predeterminado.

0

Tendrá que implementar un MAPI client. Esto le permitirá rellenar el documento, agregar archivos adjuntos, etc. antes de presentar el mensaje al usuario para enviarlo. Puede usar el almacén de mensajes predeterminado para usar su cliente de correo predeterminado.

Cuestiones relacionadas