Entwickler-Ecke

Internet / Netzwerk - mit Indy eMail-Anhang prüfen ?


OliverN_26 - Fr 19.08.11 20:07
Titel: mit Indy eMail-Anhang prüfen ?
Hey.

Ich will meinen Posteingang nach bestimmten Mails durchsuchen. Diese haben eine Excel-Liste im Anhang. Ist es möglich diese Excel-liste z.B. aus dem Anhang heraus in einen Ordner zu speichern, um anschließend die Liste zu laden und zu bearbeiten? Die sich darin befindenen Daten soll anschließend in eine Online Datenbank geschrieben werden.
Mir gehts aber nur um die Anhang-Geschichte.

Vielen Dank im voraus für eure Tips


OliverN_26 - Sa 20.08.11 08:43

Hat echt keiner ne Idee?

Im Grunde soll nur der Anhang einer bestimmten eMail in einen anderen Ordner kopiert werden.
Find da einfach keinen Ansatz :-(


haentschman - Sa 20.08.11 09:05

Moin...

http://forum.delphi-treff.de/showthread.php?24966-IdPOP3-(V.10)-Anh%E4nge&p=179871&viewfull=1#post179871
schau mal da. Mail Anhänge speichern for Runnaways... :lol:
Ansonsten wirft die SuFu mit "Indy Attachment" in allen Foren reichlich raus.


OliverN_26 - Mo 22.08.11 09:38

Hallo

Ich hab mal ein wenig probiert und mir was gebastelt.
Ist es möglich das sich mal jemand den Quellcode ansehen kann, ob das so richtig ist, oder ob man das ein oder andere optimieren kann?


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:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
procedure TForm1.Mailsprfen1Click(Sender: TObject);
var
  AnzahlMail,AnzahlAnhang,i,neu : Integer;
  IdMessage1 : TIdMessage;
  Dateiname,Pfad,Zeitstempel : String;
begin
  i   := 0;
  neu := 0;

  // StringGrid initialisieren
  init;

  // Verbindung zum Server herstellen
  POP.Host := 'pop.gmx.net';
  POP.Connect;

  // prüfen ob Attachment-Ordner existiert
  Pfad := ExtractFilePath(ParamStr(0)) + 'Mail-Anhang\';
  if not DirectoryExists(Pfad) then
    CreateDir(Pfad);

  StatusBar1.Panels[0].Text := ' Posteingang wird geprüft ...';
  
  for AnzahlMail := 1 to POP.CheckMessages do begin
    StatusBar1.Panels[1].Text := ' Mail: ' + IntToStr(AnzahlMail) + ' / ' + IntToStr(POP.CheckMessages);
    StatusBar1.Panels[2].Text := ' Gefunden: ' + IntToStr(i);
    Application.ProcessMessages;

    IdMessage1 := TIdMessage.Create(Self);
    POP.Retrieve(AnzahlMail, IdMessage1);
    if IdMessage1.MessageParts.Count > 0 then begin
      for AnzahlAnhang := 0 to IdMessage1.MessageParts.Count - 1 do begin
        if (IdMessage1.MessageParts.Items[AnzahlAnhang] is TIdAttachment) then begin
          Dateiname := TIdAttachment(IdMessage1.MessageParts.Items[AnzahlAnhang]).Filename;
          if (ExtractFileExt(Dateiname) = '.xlsx'or (ExtractFileExt(Dateiname) = '.xls'then begin
            // prüfen ob die Mail bereits abgerufen wurde
            if MsgID_pruefen(IdMessage1.MsgId) then begin
              // Mail-ID speichern um sie als abgerufen zu markieren
              MsgID_schreiben(IdMessage1.MsgId);

              neu := neu + 1;

              Zeitstempel := FormatDateTime('ddmmyyyyhhnnss', Now);
              Pfad := ExtractFilePath(ParamStr(0)) + 'Mail-Anhang\' + Zeitstempel + '_' + Dateiname;

              // Anhang im Attachment-Ordner speichern
              TIdAttachment(IdMessage1.MessageParts.Items[AnzahlAnhang]).SaveToFile(Pfad);
            end;

            i := i + 1;

            StringGrid1.Cells[0,i] := IdMessage1.MsgId;                 // MsgID
            if UploadID_pruefen(IdMessage1.MsgId) then
              StringGrid1.Cells[1,i] := '1';                            // UploadID (ob bereits in die Datenbank geladen wurde)
            StringGrid1.Cells[3,i] := DateToStr(IdMessage1.Date);       // Datum
            StringGrid1.Cells[4,i] := UTF8ToAnsi(IdMessage1.Subject);   // Betreff
            StringGrid1.Cells[5,i] := UTF8ToAnsi(IdMessage1.From.Text); // Absender
            StringGrid1.Cells[6,i] := Dateiname;                        // Dateiname
          end;
        end;
      end;
    end;
    IdMessage1.Free;
  end;

  if i > 0 then begin
    SetHeader;
    AutoSetAnzeige(StringGrid1);
  end;

  if neu = 1 then
    StatusBar1.Panels[0].Text := IntToStr(neu) + ' neue Meldung'
  else
    StatusBar1.Panels[0].Text := IntToStr(neu) + ' neue Meldungen';
  StatusBar1.Panels[1].Text := '';
  StatusBar1.Panels[2].Text := '';

  // Verbindung zum Server trennen
  POP.Disconnect;
end;


Vielen Dank

lg
Oli