AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi EMails auslesen mit Simple MAPI
Thema durchsuchen
Ansicht
Themen-Optionen

EMails auslesen mit Simple MAPI

Ein Thema von Katrin · begonnen am 16. Sep 2009 · letzter Beitrag vom 5. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2      
Katrin

Registriert seit: 19. Jan 2007
Ort: Arnsberg
5 Beiträge
 
#1

EMails auslesen mit Simple MAPI

  Alt 16. Sep 2009, 11:02
Hallo zusammen,

ich habe folgendes Problem:
Ich möchte mit Hilfe von Simple MAPI meine ungelesenen Mails aus Outlook Express auslesen. Dazu benutze ich folgenden Quellcode:

Delphi-Quellcode:
uses Mapi;

procedure TForm1.Button1Click(Sender: TObject);
var Err: Cardinal;
    SessionID: LHANDLE;
    MessID: AnsiChar;
    pMsg: PMapiMessage;
    i: Integer;
begin
  Err := MapiLogOn(Handle, '', '', MAPI_EXPLICIT_PROFILE, 0, @SessionID);

  i := 1;
  Err := MapiFindNext(SessionID, Handle, '', '', MAPI_UNREAD_ONLY, 0, @MessID);
  while Err = SUCCESS_SUCCESS do
  begin
    Err := MapiReadMail(SessionID, 0, @MessID, MAPI_UNREAD_ONLY or MAPI_PEEK, 0, pMsg); // <- ab hier simmt die Session-ID nicht mehr
    if Err = SUCCESS_SUCCESS
    then begin
      StringGrid1.Cells[0,i] := MessID;
      StringGrid1.Cells[1,i] := pMsg^.lpOriginator^.lpszName + ' (' + pMsg^.lpOriginator^.lpszAddress + ')';
      StringGrid1.Cells[2,i] := pMsg^.lpszSubject;
      StringGrid1.Cells[3,i] := pMsg^.lpszDateReceived;
      Inc(i);
    end;

    Err := MapiFreeBuffer(pMsg);

    Err := MapiFindNext(SessionID, 0, nil, @MessID, MAPI_UNREAD_ONLY, 0, @MessID);
  end;

  Err := MapiLogOff(SessionID, 0, MAPI_LOGOFF_SHARED, 0);
end;
Nach dem ersten Aufruf von MapiFindNext wird meine SessionID, die ich über MapiLogon bekommen habe, überschrieben. Jeder weitere Mapi-Funktionsaufruf funktioniert danach nicht mehr.

Kann mir jemand erklären, woran das liegt? Habe ich evtl. einen Fehler beim Referenzieren/Dereferenzieren der Zeiger gemacht?

Schon mal im Voraus vielen Dank für Eure Hilfe
Katrin
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

Re: EMails auslesen mit Simple MAPI

  Alt 16. Sep 2009, 14:18
Lokale Variablen ändern sich.
Schreibe Deine SessionID in eine globale Variable oder in ein Edit-Feld.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: EMails auslesen mit Simple MAPI

  Alt 16. Sep 2009, 14:25
Hallo,
Zitat von hathor:
Lokale Variablen ändern sich.
Schreibe Deine SessionID in eine globale Variable oder in ein Edit-Feld.
Problem bleibt damit bestehen, komme irgendwie nicht dahinter, was hier falsch läuft.

Damit scheint es zu funktionieren:
Delphi-Quellcode:
uses Mapi;

Var
    SessionID: LHANDLE; // <- warum das erforderlich ist, hätte ich gerne mal erklärt.

procedure TForm1.Button1Click(Sender: TObject);
var Err: Cardinal;
    // SessionID: LHANDLE; // <- Wieso muss die ausserhalb der Prozedure deklariert sein?
    MessID: AnsiChar;
    pMsg: PMapiMessage;
    i: Integer;
begin
  Err := MapiLogOn(Handle, '', '', MAPI_EXPLICIT_PROFILE, 0, @SessionID);
  i := 1;
  Err := MapiFindNext(SessionID, 0, nil, nil, 0 {MAPI_UNREAD_ONLY}, 0, @MessID);
  while Err = SUCCESS_SUCCESS do
  begin
    Err := MapiReadMail(SessionID, Handle, @MessID, 0 {MAPI_UNREAD_ONLY or MAPI_PEEK}, 0, pMsg); // <- ab hier simmt die Session-ID nicht mehr
    if (Err = SUCCESS_SUCCESS)
    then begin
      StringGrid1.Cells[0,i] := MessID;
      StringGrid1.Cells[1,i] := pMsg^.lpOriginator^.lpszName + ' (' + pMsg^.lpOriginator^.lpszAddress + ')';
      StringGrid1.Cells[2,i] := pMsg^.lpszSubject;
      StringGrid1.Cells[3,i] := pMsg^.lpszDateReceived;
      Inc(i);
      StringGrid1.RowCount := i + 1;
      Application.ProcessMessages;
    end;
    Err := MapiFreeBuffer(pMsg);
    Err := MapiFindNext(SessionID, 0, nil, @MessID, 0 {MAPI_UNREAD_ONLY}, 0, @MessID);
  end;
  Err := MapiLogOff(SessionID, 0, MAPI_LOGOFF_SHARED, 0);
end;
  Mit Zitat antworten Zitat
Katrin

Registriert seit: 19. Jan 2007
Ort: Arnsberg
5 Beiträge
 
#4

Re: EMails auslesen mit Simple MAPI

  Alt 21. Sep 2009, 09:18
Danke für den Tipp mit der globalen Variable. Die Mails werden jetzt ausgelesen.

Allerdings bekomme ich nun diese Meldung, wenn die Prozedur komplett abgearbeitet wurde:

---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt D:\Katrin\Prog\MapiTest\MapiTest.exe trat ein Problem mit folgender Meldung auf: 'access violation at 0x00433fc0: read of address 0x00003137'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------

Habt ihr dazu vielleicht auch noch eine Idee?
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

Re: EMails auslesen mit Simple MAPI

  Alt 21. Sep 2009, 09:29
Hallo Katrin,

nö, habe da keine Idee, habe mir schon 'nen Wolf gesucht, um herauszufinden, wo es denn da bitte knallt. Mit dem Debugger bin ich da nicht weitergekommen. Vermute, dass der "Fehler" ausserhalb des Delphicodes auftritt, bzw. habe keine Ahnung, wie man das in Delphi ändern muss, damit es nicht mehr knallt.
Vermutlich scheitert das MapiFindNext, wenn es nichts mehr zu finden gibt, aber da bin ich mir noch nicht so sicher.
Eventuell versuchst Du mal (sofern noch nicht geschehen), durch diverse Try Except eine Konstellation zu finden, bei der Du die Schutzverletzung (ohne negative Nebenwirkungen) ignorieren kannst (Ich weiß ist äußerst unsauber, aber mir fällt da momentan nix besseres zu ein.).

[edit]Schreibfehler und unsinnige Satzstellung korrigiert.[/edit]
  Mit Zitat antworten Zitat
Katrin

Registriert seit: 19. Jan 2007
Ort: Arnsberg
5 Beiträge
 
#6

Re: EMails auslesen mit Simple MAPI

  Alt 21. Sep 2009, 09:48
Hallo Stephan,

erstmal Danke, dass Du Dir die Zeit nimmst, mir zu helfen.

Das MapiFindNext gibt einen bestimmten Code (MAPI_E_NO_MESSAGES) zurück, wenn es alle Mails gelesen hat. Das würde ich mal als Fehlerquelle ausschließen. Vor allem, weil der Fehler nicht auftritt, wenn es nichts zu lesen gibt.

Mit dem Try-Except-Block experimentiere ich jetzt mal ein bisschen.

Katrin
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

Re: EMails auslesen mit Simple MAPI

  Alt 21. Sep 2009, 10:24
Gib uns doch bitte den ganzen Code als Anhang.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

Re: EMails auslesen mit Simple MAPI

  Alt 21. Sep 2009, 10:39
Hallo,

stehe da jetzt vor einem Problem, dass ich nicht lösen kann:

Habe mal als Anhang einen Screenshot vom CPU-Fenster der IDE gemacht. Die Stelle, an der die Zugriffsverletzung auftritt, ist markiert. Wer kann uns sagen, wie wir diesem Fehler auf die Schliche kommen können, momentan habe ich keine Ahnung, wo überhaupt der Fehler (ausgehend vom Quelltext) zu suchen ist.

Der von mir genutzte Quelltext hängt ebenfalls am Post.

Wenn ich das beim letzten Versuch richtig interpretiert habe, tritt der Fehler hinter
  Err := MapiLogOff(SessionID, 0, MAPI_LOGOFF_SHARED, 0); auf und zwar in der Unit Windows beim Aufruf vonfunction GetMailslotInfo; external kernel32 name 'GetMailslotInfo'; Durch die Funktion MapiLogOff komme ich mit dem Debugger im Einzelschritt noch durch.

Geändert von nahpets (21. Nov 2017 um 16:41 Uhr)
  Mit Zitat antworten Zitat
Katrin

Registriert seit: 19. Jan 2007
Ort: Arnsberg
5 Beiträge
 
#9

Re: EMails auslesen mit Simple MAPI

  Alt 21. Sep 2009, 10:47
Zitat von hathor:
Gib uns doch bitte den ganzen Code als Anhang.
Kein Problem, es steht aber kaum mehr drin als in meinem ersten Post.
Angehängte Dateien
Dateityp: zip mapitest_916.zip (2,3 KB, 14x aufgerufen)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#10

Re: EMails auslesen mit Simple MAPI

  Alt 21. Sep 2009, 11:34
Ich bekomme 2 Fehlermeldungen:

[Pascal Hint] FormMain.pas(70): H2077 Value assigned to 'Err' never used
[Pascal Hint] FormMain.pas(75): H2077 Value assigned to 'Err' never used
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:07 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