Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Email über Outlook mit MAPI - Zugriffsverletzung (https://www.delphipraxis.net/190791-email-ueber-outlook-mit-mapi-zugriffsverletzung.html)

Freyr77 8. Nov 2016 10:35

Delphi-Version: 10 Seattle

Email über Outlook mit MAPI - Zugriffsverletzung
 
Hallo.

Ich versuche gerade über folgenden Code aus der DP (http://www.delphipraxis.net/157337-e...anhaengen.html) ein Mail-Programm zu basteln, dass auf Jenkins zugreift.

Man wählt eine Freigabe aus und das Programm generiert die Mail und versendet sie.

Meine Fehlermeldung tritt beim aufrufen von "SendEMail" auf, das ganze sieht so aus:

Delphi-Quellcode:
function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
var
  lMessage: TMapiMessage;
  lMailTo : array of TMapiRecipDesc;
  iCounter, j, mc, lMailToCount: integer;
  lMapiSession: Cardinal;
  lWndList : Pointer;
  lAMailCounter: array[1..3] of integer;
  lAttachements: array of TMapiFileDesc;
  lAttachCount: Integer;
  lFileName: string;
  i: Integer;

  function GetEMailValue(lMailToClass, index: integer) : string;
  begin
    result := Mail.Values[AnsiString(lMailToClass)+inttostr(index)];
  end;

begin
  result := MAPI_E_FAILURE;
    if (MapiLogOn(Handle, PAnsiChar(''), PAnsiChar(''), MAPI_LOGON_UI or MAPI_NEW_SESSION, 0, @lMapiSession) <> SUCCESS_SUCCESS) then
    begin
    MessageBox(Handle, PChar('Versenden fehlgeschlagen'), PChar('Fehler'), MB_ICONERROR or MB_OK)
    end
    else
    begin
    for mc := MAPI_TO to MAPI_BCC do
      begin
      lAMailCounter[mc] := 0;
      end;

      //++Empfänger zählen, evtl raus++
      for j := 0 to MaxInt do
        begin
        if GetEMailValue(mc,j) = '' then
        Break;
        Inc(lAMailCounter[mc]);
        end;
      //++ ++

    end;

    //++Gesamtempfängerzahl - evtl raus++
    lMailToCount := lAMailCounter[MAPI_TO] + lAMailCounter[MAPI_CC] + lAMailCounter[MAPI_BCC];
    //++ ++

    //++ Empfängerarray - evtl raus++
    SetLength(lMailTo, lMailToCount);
    //++ ++
    iCounter := 0;
    if lMailToCount > 0 then
      begin
      for mc := MAPI_TO to MAPI_BCC do
       if lAMailCounter[mc] > 0 then
        for j := 0 to lAMailCounter[mc] -1 do
          begin
          lMailTo[iCounter].ulReserved := 0;
          lMailTo[iCounter].ulRecipClass := mc;
          lMailTo[iCounter].lpszName := StrNew(PAnsiChar(AnsiString(GetEMailValue(mc,j))));
          lMailTo[iCounter].lpszAddress := StrNew(PAnsiChar(AnsiString('SMTP:' + GetEMailValue(mc, j))));
          lMailTo[iCounter].lpEntryID := nil;
          lMailTo[iCounter].ulEIDSize := 0;
          Inc(iCounter);
          end;
      end;

    //++ Empfängeranzahl in Mail und Pointer auf Empfängerarray - evtl raus++
    lMessage.nRecipCount := lMailToCount;
    lMessage.lpRecips := Pointer(lMailTo);
    //++ ++

    if Mail.Values['subject'] <> '' then
    begin
    lMessage.lpszSubject := PAnsiChar(AnsiString(Mail.Values['subject']));
    end;

    if Mail.Values['body'] <> '' then
    begin
    lMessage.lpszNoteText := PAnsiChar(AnsiString(Mail.Values['body']));
    end;

    lAttachCount := 0;
    for i := 0 to MaxInt do
    begin
      if Mail.Values['attachment' + IntToStr(icounter)] = '' then
      Break;
      Inc(lAttachCount);
    end;

    SetLength(lAttachements, lAttachCount);

    if lAttachCount > 0 then
    begin
       for iCounter := 0 to lAttachCount -1 do
      begin
      lFileName := Mail.Values['attachement' + IntToStr(iCounter)];
      lAttachements[iCounter].ulReserved := 0;
      lAttachements[iCounter].flFlags := 0;
      lAttachements[iCounter].nPosition := ULONG($FFFFFFFF);
      lAttachements[iCounter].lpszPathName := StrNew(PAnsiChar(AnsiString(lFileName)));
      lAttachements[iCounter].lpszFileName := StrNew(PAnsiChar(AnsiString(ExtractFileName(lFileName))));
      lAttachements[iCounter].lpFileType := nil;
      end;
    lMessage.nFileCount := lAttachCount;
    lMessage.lpFiles := Pointer(lAttachements);
    end;

    lWndList := DisableTaskWindows(0);
    try
      result := MapiSendMail(lMapiSession, Handle, lMessage, MAPI_DIALOG, 0);
    finally
      EnableTaskWindows(lWndList);

    for iCounter := 0 to lMailToCount-1 do
    begin
      StrDispose(lMailTo[iCounter].lpszName);
      StrDispose(lMailTo[iCounter].lpszAddress);
    end;

    for i := 0 to lAttachCount-1 do
    begin
      StrDispose(lAttachements[iCounter].lpszPathName);
      StrDispose(lAttachements[iCounter].lpszFileName);
    end;
    Finalize(lAttachements);
    Finalize(lMailTo);
  end;
  MapiLogOff(lMapiSession, Handle, 0, 0);
end;
.. aufgerufen über einen Button:

Delphi-Quellcode:
procedure btnSendMailClick(Sender: TObject);
var
  lMail: TStringList;
  lText: string;
  lSubject: string;

begin
 lMail := TStringList.Create;

 lText := MailHandle(edtInhalt.Text);
 lSubject := SubjectHandle(edtBetreff.Text);

 try
   lMail.Values['to0'] := 'test@test.de';
   lMail.Values['subject'] := lSubject;
   lMail.Values['body'] := lText;
   SendEMail(Self.Handle, lMail);
 finally
  lMail.Free;
 end;
end;
Beim debuggen komme ich nicht mal bis zur SendEMail Funktion. Er ruft folgende Exception auf:

"Zugriffsverletzung bei Adresse 0040A39E .... Lesen von Adresse FFFFFF8"

Ich kann bis zum Aufruf von SendEMail debuggen, dann springt er gleich in die Exception, ohne den Code aufzurufen.

Freyr77 10. Nov 2016 12:41

AW: Email über Outlook mit MAPI - Zugriffsverletzung
 
Ich denke nicht das hier noch eine Antwort kommt, aber es hat sich zwischenzeitlich erledigt. Bin auf SMTP und Ole umgestiegen.

Bernhard Geyer 10. Nov 2016 13:51

AW: Email über Outlook mit MAPI - Zugriffsverletzung
 
Schau dir mal die Implementierung in der Jedi (JCL) an.
Dort gibt es eine SimpleMAPI-Implementierung die wir seit Jahren problemlos einsetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz