Autor Beitrag
OliverN_26
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Mo 22.08.11 12:23 
Hallo

Ich hab ein Funktion die mir in gewissen Abständen den Posteingang auf bestimmte Mails prüft.
Nun will ich natürlich nicht das der jedesmal den kompletten Posteingang durchrödelt, sondern sich nur auf die neu eingegangenen beschränkt.
Gibts da nen Trick ?

Danke
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mo 22.08.11 15:29 
Ich habe eine Liste definiert, in der die E-Mails gspeichert werden, welche sich hier im Ordner "gesendete Objekte" befinden. Ähnliches gilt auch für den Posteingang, dann statt "olFolderSentMail" "olFolderInBox" verwenden.
Du hast dann die Information über das Sendedatum. "EMail.SentOn" Wenn Du bei der Abfrage eine globale Variable definierst, in der Du den Zeitzpunkt der Abfrage speicherst, dann kannst Du die Emails im Ordner nach neuerem Datum untersuchen udn vielleicht filtern.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
uses //Outlook8-Unit hinzufügen
   ... , Outlook8,...


procedure ViewSendMail(Liste: TStringGrid);
var
  SendMailFolder: Variant;
  email: Variant;
  n, i, j: longint;
  s, subj: string;
  Datum: TDateTime;
begin
  initOutlook;
  if not OutlookExist then
  begin
    MessageDlg(EMailInfo, mtInformation, [mbOk], 0);
    EXIT;
  end;
  j := 0;
  SendMailFolder := oleNameSpace.GetDefaultFolder(olFolderSentMail);
  n := SendMailFolder.Items.Count;
  Liste.ColCount := 6;
  Liste.Cells[00] := 'i';
  Liste.Cells[10] := 'gelesen';
  Liste.Cells[20] := 'Datum';
  Liste.Cells[30] := 'von';
  Liste.Cells[40] := 'an';
  Liste.Cells[50] := 'Betreff';
  for i := 1 to n do
  begin
    email := oleNameSpace.GetDefaultFolder(olFolderSentMail).Items(i);
    Liste.RowCount := i + 1;
    Liste.Cells[0, i] := IntToStr(i);
    if EMail.Unread then
      Liste.Cells[1, i] := 'NEIN'
    else
      Liste.Cells[1, i] := 'JA';
    Liste.Cells[2, i] := DateTimeToStr(EMail.SentOn);
    Liste.Cells[3, i] := EMail.SenderName;
    Liste.Cells[4, i] := EMail. to ; // das muss so geschrieben werden, sonst gibt es einen Fehler. Ist ein Fehler in Outlook8 (Die Eigenschaft "to" ist ja auch ein reserviertes Wort "to")
    Liste.Cells[5, i] := EMail.Subject;
  end;
end;


Allerdings geht die Routine trotzdem den ganzen Ordner durch. Denn die Routine weiß ja nicht im voraus, welche neueren Datums sind. Zumal ja nicht immer die E-Mails nach Datum sortiert sind. Vielleicht hilft Dir das bei der Umsetzung. Ich habe die Routine in meinen Programmen implementiert. Bei Problemen bitte nachfragen. Ich kann Dir auch den Quelltext der Outlook8-Unit senden.

Es sollte eine TStringlist im Formular sein. Der Aufruf der Prozedur erfolgt wie folgt:

ausblenden Delphi-Quelltext
1:
  ViewSendMail(sg_EMails);  // sg_Emails ist das Stringgrid					

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Do 25.08.11 09:16 
Danke für den Ansatz. Wäre definitiv umsetzbar aber letztendlich sind wir zu dem Entschluß gekommen, eine Kopie der entsprechenden Mails direkt vom Server auf ein eigenes pop3 Konto umzuleiten. Von da können die Mails, dann geholt, verarbeitet und direkt wieder gelöscht werden. So läuft das Postfach nicht voll und ich sehe automatisch was noch nicht bearbeitet ist, womit sich meine Frage erübrigt hat :-)

lg
Oli