Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Probleme mit einem Spammmfilter


Bethsoftfan - So 06.04.08 15:04
Titel: Probleme mit einem Spammmfilter
Wir haben mal wieder eine Frage :P

Wir schreiben an einem Spammfilter, aber der scheint Fehler zu beinhalten. . .


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:
procedure TFrmMain.BtMaillisteClick (Sender: TObject);
begin
  if (zZustand = cBereit)
    then
      Pop3Client.Socket.SendText ('LIST' + Chr(13) + Chr(10))
    else  {Fehlerbehandlung ... }
      MemStatus.Lines.Add ('Status: Client nicht bereit');
end;
procedure TFrmMain.BtHolenClick (Sender: TObject);
var i,j,k       : integer;
    s,x           : string;
begin
  if (zZustand = cBereit)
    then begin
    if IdPop31.CheckMessages > 0 then
      begin
      Pop3Client.Socket.SendText ('RETR');
          For i := 1 to IDPop31.CheckMessages do begin
          IDMessage1.Clear;
          IDpop31.Retrieve(i,IDMessage1);

s := '*popo*';
For j := 0 to length(s) do
begin
For k := 0 to length(s) do
  begin
  x := Copy(s,0, i-1) +uppercase(Copy(s, i, j))+ Copy(s,i+1,length(s));
          if Pos(x, IdMessage1.Subject) > 0 then
          begin
          Listview2.Items.Add.Caption := IdMessage1.Subject;
          Listview2.Items[i-1-Listview1.Items.Count].SubItems.Add(IDMessage1.From.Address);
          Listview2.Items[i-1-Listview1.Items.Count].SubItems.Add(DateToStr(IDMessage1.Date));
          end
          else
          begin
          Listview1.Items.Add.Caption := IdMessage1.Subject;
          Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(DateToStr(IDMessage1.Date));
          Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(IDMessage1.From.Address);
          Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(IntToStr(IDpop31.RetrieveMsgSize(i) div 1024)+'kb');
          Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(IdMessage1.MsgId);
          Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(IdMessage1.Body.Text);
          end;
      end;
      end;
      end;
end;
end;
end;


Hier haben wir 2 Probleme :

1) Die Spamms erscheinen in dem ListView für die normalen Mails
und
2) Jede der Emails werden so oft da gestellt, wie die Schleife durch läuft, also ziemlich lange :cry:

Danke für Hilfe!


Bethsoftfan - Do 10.04.08 18:01

sry, muss pushen!

Wir habens immer noch nicht! :cry:


Christian S. - Fr 11.04.08 11:49
Titel: Re: Probleme mit einem Spammmfilter
Hallo!

Hier erstmal der Quelltext in lesbarer Form, also richtig formatiert ;-)

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:
procedure TFrmMain.BtMaillisteClick (Sender: TObject);
begin
  if (zZustand = cBereit)
    then
      Pop3Client.Socket.SendText ('LIST' + Chr(13) + Chr(10))
    else  {Fehlerbehandlung ... }
      MemStatus.Lines.Add ('Status: Client nicht bereit');
end;
procedure TFrmMain.BtHolenClick (Sender: TObject);
var i,j,k       : integer;
    s,x           : string;
begin
  if (zZustand = cBereit) then
  begin
    if IdPop31.CheckMessages > 0 then
    begin
      Pop3Client.Socket.SendText ('RETR');
      For i := 1 to IDPop31.CheckMessages do
      begin
        IDMessage1.Clear;
        IDpop31.Retrieve(i,IDMessage1);

        s := '*popo*';
        For j := 0 to length(s) do
        begin
          For k := 0 to length(s) do
          begin
            x := Copy(s,0, i-1) +uppercase(Copy(s, i, j))+ Copy(s,i+1,length(s));
            if Pos(x, IdMessage1.Subject) > 0 then
            begin
              Listview2.Items.Add.Caption := IdMessage1.Subject;
              Listview2.Items[i-1-Listview1.Items.Count].SubItems.Add(IDMessage1.From.Address);
              Listview2.Items[i-1-Listview1.Items.Count].SubItems.Add(DateToStr(IDMessage1.Date));
            end
            else
            begin
              Listview1.Items.Add.Caption := IdMessage1.Subject;
              Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(DateToStr(IDMessage1.Date));
              Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(IDMessage1.From.Address);
              Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(IntToStr(IDpop31.RetrieveMsgSize(i) div 1024)+'kb');
              Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(IdMessage1.MsgId);
              Listview1.Items[i-1-Listview2.Items.Count].SubItems.Add(IdMessage1.Body.Text);
            end;
          end;
        end;
      end;
    end;
  end;
end;


Nun zu Eurem Problem: Wenn ich das richtig sehe, sind die j- und die k-Schleife dazu da, jede Kombination aus Groß- und Kleinschriebung zu erkennen. Das Problem dabei ist, wenn im Betreff steht "PoPo", dann wird die Mail bei "popo" nicht als Spam erkannt und in die normalen Mails eingefügt, genauso bei "pOPO", "Popo", etc.

Ihr könnt aber viel einfacher vorgehen. Die Schleifen könnt Ihr Euch sparen, wenn Ihr es so macht:

Delphi-Quelltext
1:
2:
3:
4:
lowerSubject := lowercase(IdMessage1.Subject);
lowerX := lowercase(x);
if Pos(lowerX, lowerSubject) > 0 then
//...

Ihr prüft also, ob ein vollständiges kleines Wort im vollständig kleinen Betreff steht. Damit sind die j- und die k-Schleife hinfällig. Für komplizierte Prüfungen solltet Ihr Euch mal Suche in der Entwickler-Ecke TREGEXP ansehen.

Grüße
Christian :-)


Bethsoftfan - Sa 12.04.08 19:01

Ok, danke es funzt!

Achja, und happy birthday!