C++ Builder Snippets  

E-Mails mit Hilfe der Windows MAPI-Funktionen versenden:
 
//---------------------------------------------------------------------------
// Funktion MapiSendMail() benutzt Windows Messaging API-Funktionen zum
// Versenden der E-Mails über MAPI-fähige E-Mail Clients (MS Outlook,
// Netscape Messenger etc.)
//---------------------------------------------------------------------------
// Übergabeparameter:
// TStrings* pslRecipients   - Zeiger auf eine TStrings-Instanz mit den
//                             Empfängeraddressen
// TStrings* pslCcRecipients - Zeiger auf eine TStrings-Instanz mit den
//                             Kopienempfänger-Adressen. NULL kann übergeben
//                             werden, falls keine Kopien verschickt werden
// AnsiString slSubject      - Betreff
// AnsiString slText         - Text (Body)
// TStrings* pslAttachments  - Zeiger auf eine TStrings-Instanz mit den
//                             Namen der anzuhängenden Dateien (NULL falls
//                             keine Anhänge)
//---------------------------------------------------------------------------
// Rückgabewert:     true bei erfolgreicher Ausführung, anderenfalls false
//---------------------------------------------------------------------------
// Beispielaufruf:
// #include <mapi.h>
// TStringList* pslAddresses = new TStringList();
// pslAddresses->Add("abc@def.gh");
// pslAddresses->Add("bca@def.gh");
// pslAddresses->Add("cab@def.gh");
// if(!MapiSendMail(pslAddresses, NULL, "Wichtig !",
//   "Hi, ruf\' mich bitte an !\r\nregards\r\nSven", NULL))
//   ShowMessage("Fehler beim Versenden der E-Mail aufgetreten !");
// delete pslAddresses;
//---------------------------------------------------------------------------
bool MapiSendMail(TStrings* pslRecipients, TStrings* pslCcRecipients,
  AnsiString slSubject, AnsiString slText, TStrings* pslAttachments)
{
  // Falls keine Empfänger definiert, abbrechen:
  if(!pslRecipients || !pslRecipients->Count)
    return false;

  bool blRetVal = true;  // Rückgabewert

  HINSTANCE hMapi=LoadLibrary("MAPI32.DLL");
  if(hMapi)
  {
    // Zeiger auf die Funktionen MAPILogon(), MAPILogoff(),
    // MAPISendMail() besorgen:
    LPMAPILOGON pfMapiLogon= (LPMAPILOGON)
      GetProcAddress(hMapi,"MAPILogon");
    LPMAPILOGOFF pfMapiLogoff=(LPMAPILOGOFF)
      GetProcAddress(hMapi,"MAPILogoff");
    LPMAPISENDMAIL pfMapiSendMail=(LPMAPISENDMAIL)
      GetProcAddress(hMapi,"MAPISendMail");
    // Funktionszeiger auf NULL prüfen:
    blRetVal = pfMapiLogon && pfMapiLogoff && pfMapiSendMail;

    // MAPI-Session starten:
    LHANDLE hSession = NULL;
    if(blRetVal) blRetVal = ((*pfMapiLogon)(0, NULL, NULL, MAPI_LOGON_UI, 0,
      &hSession) == SUCCESS_SUCCESS);

    // Falls soweit alles ok:
    if(blRetVal)
    {
      // Anzahl der Empfänger bestimmen:
      int ilRecCount = pslRecipients->Count;
      // Anz. der Kopien-Empfänger bestimmen:
      if(pslCcRecipients && pslCcRecipients->Count)
        ilRecCount += pslCcRecipients->Count;

      // "Empfängerbeschreibungsstrukturen" erzeugen und füllen:
      MapiRecipDesc* pstRecDesc = new MapiRecipDesc[ilRecCount];

      AnsiString slAddress;
      // Die Hauptempfängerliste bearbeiten:
      for(int ilLine = 0; ilLine < pslRecipients->Count; ilLine++)
      {
        memset(&pstRecDesc[ilLine], 0, sizeof(MapiRecipDesc));
        slAddress = pslRecipients->Strings[ilLine];
        pstRecDesc[ilLine].ulRecipClass = MAPI_TO;
        pstRecDesc[ilLine].lpszName = AnsiString("SMTP:"+slAddress).c_str();
        pstRecDesc[ilLine].lpszName = new char[slAddress.Length() + 1];
        strcpy(pstRecDesc[ilLine].lpszName,slAddress.c_str());
        pstRecDesc[ilLine].lpszAddress = new char[slAddress.Length() + 6];
        strcpy(pstRecDesc[ilLine].lpszAddress,("SMTP:"+slAddress).c_str());
      }

      int ilIndex = 0;
      // Die Kopien-Empfängerliste bearbeiten:
      for(int ilLine = 0; pslCcRecipients && ilLine <
        pslCcRecipients->Count; ilLine++)
      {
        ilIndex = pslRecipients->Count+ilLine;
        memset(&pstRecDesc[ilIndex], 0, sizeof(MapiRecipDesc));
        slAddress = pslCcRecipients->Strings[ilLine];
        pstRecDesc[ilIndex].ulRecipClass = MAPI_CC;
        pstRecDesc[ilIndex].lpszName = new char[slAddress.Length() + 1];
        strcpy(pstRecDesc[ilIndex].lpszName,slAddress.c_str());
        pstRecDesc[ilIndex].lpszAddress = new char[slAddress.Length() + 6];
        strcpy(pstRecDesc[ilIndex].lpszAddress,("SMTP:"+slAddress).c_str());
      }

      // Liste der Anhänge bearbeiten:
      MapiFileDesc* pstFilesDesc = NULL;
      if(pslAttachments && pslAttachments->Count)
      {
        pstFilesDesc = new MapiFileDesc[pslAttachments->Count];
        AnsiString slFullPath, slFileName;
        for(int ilLine = 0; ilLine < pslAttachments->Count; ilLine++)
        {
          memset(&pstFilesDesc[ilLine], 0, sizeof(MapiFileDesc));
          slFullPath = pslAttachments->Strings[ilLine];
          slFileName = slFullPath.SubString(slFullPath.LastDelimiter("\\:")+1,
            slFullPath.Length());
          pstFilesDesc[ilLine].nPosition = (ULONG) -1;
          pstFilesDesc[ilLine].lpszPathName = new char[slFullPath.Length() + 1];
          pstFilesDesc[ilLine].lpszFileName = new char[slFileName.Length() + 1];
          strcpy(pstFilesDesc[ilLine].lpszPathName, slFullPath.c_str());
          strcpy(pstFilesDesc[ilLine].lpszFileName, slFileName.c_str());
        }
      }

      MapiMessage MapiMsg = { 0,slSubject.c_str(),slText.c_str(),NULL,NULL,
        NULL,0,NULL,0,0,0,0 };
      MapiMsg.nRecipCount = (ULONG)ilRecCount;
      MapiMsg.lpRecips = (lpMapiRecipDesc)(pstRecDesc);

      if(pstFilesDesc)
      {
        MapiMsg.nFileCount = (ULONG) pslAttachments->Count;
        MapiMsg.lpFiles = (lpMapiFileDesc)(pstFilesDesc);
      }

      blRetVal = (*pfMapiSendMail)(hSession,0,&MapiMsg, MAPI_LOGON_UI ,0) ==
        SUCCESS_SUCCESS;

      // Speicher aufräumen:
      // Empfänger-Listen:
      if(pstRecDesc)
      {
        for(int ilEntry=0; ilEntry < ilRecCount; ilEntry++)
        {
          delete [] pstRecDesc[ilEntry].lpszAddress;
          delete [] pstRecDesc[ilEntry].lpszName;
        }
        delete [] pstRecDesc;
      }
      // Anhänge:
      if(pstFilesDesc)
      {
        for (int ilEntry=0; ilEntry < pslAttachments->Count; ilEntry++)
        {
          delete [] pstFilesDesc[ilEntry].lpszPathName;
          delete [] pstFilesDesc[ilEntry].lpszFileName;
        }
        delete [] pstFilesDesc;
      }
    }
    // Logout...
    (*pfMapiLogoff)(hSession,0,0,0);
    FreeLibrary(hMapi);
    return blRetVal;
  }
  else return false;
}


Mehr Informationen zur MAPI-Programmierung finden Sie hier:
- Use MAPI to send e-mail
- Email-enabling your applications with Simple MAPI


Screenshot des Beispielprogramms
Screenshot des Beispielprogramms


  Download BCB5
Projekt-Quellcode
Download
Demo-Exe

© '99-2001 by S. Kreutzmann