1 votes

Comment envoyer par programme un courrier électronique avec pièce jointe à un destinataire connu en utilisant MAPI en C++ ? MAPISendMail()

Cette question est similaire, mais ne montre pas comment ajouter un destinataire.

Comment faire les deux ?

Nous souhaitons une prise en charge la plus large possible du plus grand nombre de plates-formes Windows (à partir de XP).

Nous utilisons visual studio 2008

Essentiellement, nous voulons envoyer un courriel avec :

  • adresse de destination pré-remplie
  • pièce jointe
  • ligne de l'objet

de notre programme et donner à l'utilisateur la possibilité d'ajouter des informations ou de l'annuler.

EDIT J'essaie d'utiliser MAPISendMail() J'ai copié une grande partie du code à partir des questions liées au haut de la page, mais je n'obtiens pas de fenêtre d'email et le retour d'erreur que j'obtiens de l'appel est : 0x000f - "Le système ne peut pas trouver le lecteur spécifié"

Si je commente les lignes pour définir le destinataire, cela fonctionne bien (bien sûr, je n'ai pas de destinataire pré-rempli).

Voici le code :

#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;
        LPMAPISENDMAIL lpfnMAPISendMail = NULL;

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

        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 
                    // create the msg.  We need to add recipients AND subject AND the dmp file              

                    // file attachment
                    MapiFileDesc filedesc;              
                    ::ZeroMemory(&filedesc, sizeof(filedesc));                  
                    filedesc.nPosition = (ULONG)-1;
                    filedesc.lpszPathName = "E:\\Development\\Open\\testmail\\testmail.cpp";    

                    // recipient(s)
                    MapiRecipDesc recip;
                    ::ZeroMemory(&recip, sizeof(recip));        
                    recip.lpszName = "QA email";
                    recip.lpszAddress = "qa@myaccount.com";

                    // the message
                    MapiMessage msg;
                    ::ZeroMemory(&msg, sizeof(msg));
                    msg.lpszSubject     = "Test";   
                    msg.nRecipCount     = 1; // if I comment out this line it works fine...                 
                    msg.lpRecips        = &recip;                                       
                    msg.nFileCount      = 1;
                    msg.lpFiles         = &filedesc;                

                    hr = (*lpfnMAPISendMail)(0, NULL, &msg, MAPI_LOGON_UI|MAPI_DIALOG, 0);

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

            (*lpfnMAPIUninitialize)();
        }

        FreeLibrary( hMapiModule );
    }

    return 0;
}

2voto

Tim Points 13334

Oups - j'ai oublié de mettre

recip.ulRecipClass = MAPI_TO;

Il fonctionne très bien maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X