AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Email über Outlook mit MAPI - Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

Email über Outlook mit MAPI - Zugriffsverletzung

Ein Thema von Freyr77 · begonnen am 8. Nov 2016 · letzter Beitrag vom 10. Nov 2016
Antwort Antwort
Freyr77
(Gast)

n/a Beiträge
 
#1

Email über Outlook mit MAPI - Zugriffsverletzung

  Alt 8. Nov 2016, 11:35
Delphi-Version: 10 Seattle
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.

Geändert von Freyr77 ( 8. Nov 2016 um 11:53 Uhr)
  Mit Zitat antworten Zitat
Freyr77
(Gast)

n/a Beiträge
 
#2

AW: Email über Outlook mit MAPI - Zugriffsverletzung

  Alt 10. Nov 2016, 13:41
Ich denke nicht das hier noch eine Antwort kommt, aber es hat sich zwischenzeitlich erledigt. Bin auf SMTP und Ole umgestiegen.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Email über Outlook mit MAPI - Zugriffsverletzung

  Alt 10. Nov 2016, 14:51
Schau dir mal die Implementierung in der Jedi (JCL) an.
Dort gibt es eine SimpleMAPI-Implementierung die wir seit Jahren problemlos einsetzen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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