Delphi - A MAPI.DLL e-mail küldő metódusa

forráskód letöltése
A Windows rendszermappájában megtalálható MAPI.DLL dinamikusan szerkeszthető könyvtár számos metódust tartalmaz, melyekkel leveleket küldhetünk, illetve a levélküldés adatait gyűjthetjük össze. Cikkünkben annak járunk utána, hogy milyen metódusok és adatszerkezetek találhatók a DLL-ben, és ezeket hogyan használhatjuk a levélküldés megvalósítására.
A mellékelt alkalmazás űrlapján megadhatjuk az elküldendő elektronikus levél adatait, vagyis a feladó nevét, e-mail címét, a címzett ezen adatait, a levél tárgyát és szövegét, valamint a mellékelendő állomány elérési útvonalát.
A LÉTREHOZ nyomógomb megnyomásakor felbukkan az alapértelmezett levelezőrendszer, új levél szerkesztését lehetővé tevő űrlapja a megadott adatokkal, mellyel már csak annyi a teendőnk, hogy a KÜLDÉS gombra kattintunk.
A nyomógombra kattintva meghívjuk a Send metódusunkat, mely megvalósítja a műveletet. Lássuk hogyan.
A művelet lényeg, hogy a TMapiMessage adatszerkezetben megadjuk az üzenethez kapcsolódó információkat, majd a MAPISendMail metódussal elküldjük azt.
A TMapiMessage rekord mezői tartalmazzák a levél adatait, így ezeket fel kell tölteni a metódus paramétereiben megadott értékekkel. Elsőként a levél tárgyát adjuk meg:
with m do begin
  if (Subject <> '') then lpszSubject := PChar(Subject);
A következő lépés, hogy megadjuk az üzenet szövegét:
  if (Body <> '') then lpszNoteText := PChar(Body);
A küldő és a címzett adatait egy-egy TMapiRecipDesc típusú rekord tartalmazza. Ezek mezőit is feltöltjük. Elsőként a küldő adatait adjuk meg.
if (SenderEmail <> '') then begin
  lpSender.ulRecipClass := MAPI_ORIG;
  if (SenderName = '') then
    lpSender.lpszName := PChar(SenderEMail)
  else
    lpSender.lpszName := PChar(SenderName);
  lpSender.lpszAddress := PChar(SenderEmail);
  lpSender.ulReserved := 0;
  lpSender.ulEIDSize := 0;
  lpSender.lpEntryID := nil;
  lpOriginator := @lpSender;
end;
Majd a címzett adatait:
if (RecipientEmail <> '') then begin
  lpRecipient.ulRecipClass := MAPI_TO;
  if (RecipientName = '') then
    lpRecipient.lpszName := PChar(RecipientEMail)
  else
    lpRecipient.lpszName := PChar(RecipientName);
  lpRecipient.lpszAddress := PChar(RecipientEmail);
  lpRecipient.ulReserved := 0;
  lpRecipient.ulEIDSize := 0;
  lpRecipient.lpEntryID := nil;
  nRecipCount := 1;
  lpRecips := @lpRecipient;
end
A címzett adatait tartalmazó rekord mutatóját a TMapiMessage rekord egyik mezőjében helyezzük el. A mellékelt állomány adatait egy TMapiFileDesc típusú rekord hordozza majd, melynek címét feltöltés után szintén a TMapiMessage rekordban helyezzük el.
FillChar(FileAttach, SizeOf(FileAttach), 0);
FileAttach.nPosition := Cardinal($FFFFFFFF);
FileAttach.lpszPathName := PChar(FileName);
nFileCount := 1;
lpFiles := @FileAttach;
Következő lépés, hogy a MAPI.DLL állományt betöltjük a memóriába.
MAPIModule := LoadLibrary(PChar(MAPIDLL));
Majd meghatározzuk, hogy a MAPISendMail metódus milyen címen található a DLL-ben.
@SM := GetProcAddress(MAPIModule, 'MAPISendMail');
Amennyiben ez a mutató nem NIL értékű, akkor meg is hívhatjuk a metódust a fentiekben előkészített paraméterekkel.
Result := SM(0, Application.Handle, m, MAPI_DIALOG or MAPI_LOGON_UI, 0);
A művelet eredményeképpen felbukkan az említett dialógusablak.