E Mail Spam Filter mit PHP und MySQL

www-www

Grünschnabel
Ich programmiere gerade ein E Mail Konten Script. Da können sich User registrieren und eine E Mail Adresse besitzen mit meiner Domainendung.

Meine Frage:

Ich hab alles soweit zum laufen bekommen, aber mir fehlt noch ein Spam Filter der in die MySQL Tabelle des jeweiligen Users, E Mails einträgt die er blocken möchte. Oder auch gleich in den Papierkorb oder Spam Ordner schieben möchte.

PHP:
[MOD: Trash]

Habe gelesen das dieser Befehl dazu nötig ist.

PHP:
echo "<b>Spam Filter</b><br><br><img src=images/spam.png width=16 height=16 align=absmiddle> <a href=index.php?l=spam&neu=1>Neuen Spam hinzufügen</a><br><br><table border=0 cellspacing=0 cellpadding=3 align=center width=100%>";

if($del!="") {

mysql_query("DELETE FROM mail_spam WHERE mbox='".$usrd[mbox]."' AND id='".$del."'");

echo "<tr><td colspan=6 bgcolor=#E0F2D1><img src=images/tick.png width=16 height=16 align=absmiddle> <font color=darkgreen><b>Der Spam wurde erfolgreich gelöscht.</b></font></td></tr><tr><td colspan=6><img src=images/space.gif width=1 height=13></td></tr>";

}

$getmm=mysql_query("SELECT * FROM mail_spam WHERE mbox='".$usrd[mbox]."' ORDER BY name DESC LIMIT $sza,10");

if(mysql_num_rows($getmm)==0) echo "<tr><td colspan=6 bgcolor=#B4EEB4><img src=images/cross.png width=16 height=16 align=absmiddle> <b><font color=red>Keine E Mail im Spam Filter gefunden.</font></b></td></tr>";

else {

echo "<tr><td class=footer bgcolor=#B4EEB4>&nbsp;</td><td class=footer bgcolor=#B4EEB4><b>Name</b></td><td class=footer bgcolor=#B4EEB4 colspan=2><b>E-Mail</b></td></tr>";

while($getm=mysql_fetch_array($getmm)) { $icc++;

echo "<tr><td colspan=6><img src=images/space.gif width=1 height=1></td></tr><tr onmouseover=\"this.bgColor='#E0F2D1'\" onmouseout=\"this.bgColor='#B4EEB4'\" bgcolor=#B4EEB4><td align=right><img src=images/user.png width=16 height=16></td><td class=small>".$getm[name]."</td><td class=small>".$getm[email]."</td><td align=right><a href=index.php?l=schreiben&b=".$getm[id]."><img src=images/email_go.png width=16 height=16 border=0 alt=\"E-Mail schreiben\" title=\"E-Mail schreiben\"></a><img src=images/space.gif width=5 height=16><a href=index.php?l=".$l."&del=".$getm[id]."><img src=images/cross.png width=16 height=16 border=0 alt=\"Spam löschen\" title=\"Spam löschen\"></a></td></tr>";

}}

if(mysql_num_rows($getmm)!=0) {

$next=$seite+1; $prev=$seite-1;

echo "<tr><td colspan=6><img src=images/space.gif width=1 height=15></td></tr><tr><td colspan=3 bgcolor=white>";

if($seite>0) echo "<img src=images/v.gif align=absmiddle> <b><a href=index.php?l=".$l."&seite=".$prev.">Vorherige Seite</a></b>";

else echo "<img src=images/v2.gif align=absmiddle> <b><font color=#dcdcdc>Vorherige Seite</font></b>";

echo "</td><td colspan=3 bgcolor=white align=right>";

if($icc==10) echo "<b><a href=index.php?l=".$l."&seite=".$next.">Nächste Seite</a></b> <img src=images/n.gif align=absmiddle>";

else echo "<b><font color=#dcdcdc>Nächste Seite</font></b> <img src=images/n2.gif align=absmiddle>";

echo "</td></tr>";

}

echo "</table>";

}

}

Nun weiss ich nicht mehr weiter, hab schon so viel probiert aber es will nicht klappen und Google sagt auch nichts richtiges was mir weiter helfen könnte.

Bitte um eure Hilfe, Danke

MfG
 
Hallo,

www-www hat gesagt.:
Habe gelesen das dieser Befehl dazu nötig ist.
klingt nach Singular, aus deinem Snippet entnehme ich aber mehrere Queries.
Das, was du da gepostet hast, ist ja nichts weiter als die Auflistung und eventuelle Löschung von Datensätzen einer Tabelle namens mail_spam. Du bräuchtest daneben noch die Funktion, die das Eintragen neuer Spam-Mailadressen realisiert (also einen INSERT).

Neben den paar Semantik-Fehlern(ist der benutzte Array-Index mbox eine Konstante?) solltest du auch darauf achten, mögliche Sicherheitslöcher gleich vorneweg auszuschließen. Ich meine damit vor allem mögliche SQL-Injections durch $del oder $sza (Stichwort mysql_real_escape_string()).
 
Die Sicherheitslücke wie du meinst, was ich mir mal unter

Stichwort mysql_real_escape_string()

durch gelesen habe hatte ich nicht mit eingefügt. Die Verbindung habe z.B. so und mit anderen Dokumenten noch includet.

check.cron_org.php

PHP:
<?php

function transformHTML($str) {
   if ((strpos($str,"<HTML") < 0) || (strpos($str,"<html")    < 0)) {
          $makeHeader = "<html><head><meta http-equiv=\"Content-Type\"    content=\"text/html; charset=iso-8859-1\"></head>\n";
       if ((strpos($str,"<BODY") < 0) || (strpos($str,"<body")    < 0)) {
           $makeBody = "\n<body>\n";
           $str = $makeHeader . $makeBody . $str ."\n</body></html>";
       } else {
           $str = $makeHeader . $str ."\n</html>";
       }
   } else {
       $str = "<meta http-equiv=\"Content-Type\" content=\"text/html;    charset=iso-8859-1\">\n". $str;
   }
       return $str;
}

function transformTEXT($str) {
  $str=nl2br($str);
  return $str;
}
include("config.inc.php");

mysql_connect("$dbserver","$dbuser","$dbpass");

mysql_select_db($dbdata);



function extract_attachments($mbox,$mid,$dbid,$mailbox) {

global $conf;

$structure = imap_fetchstructure($mbox, $mid); $parts = $structure->parts; $i = 0;

if (!$parts) {

$attachment = array(); $content = imap_body($mbox, $mid); } else {

$endwhile = false; $stack = array(); $content = "";

$attachment = array();

while (!$endwhile) {

if (!$parts[$i]) {

if (count($stack) > 0) {

$parts = $stack[count($stack)-1]["p"]; $i = $stack[count($stack)-1]["i"] + 1;

array_pop($stack);

} else { $endwhile = true; }}

if (!$endwhile) {

$partstring = ""; foreach ($stack as $s) { $partstring .= ($s["i"]+1) . "."; } $partstring .= ($i+1);

if (strtoupper($parts[$i]->disposition) == "ATTACHMENT") {

$attachment[] = array("filename" => $parts[$i]->parameters[0]->value,"filedata" => imap_fetchbody($mbox, $mid, $partstring));

$encoding = $parts[$i]->encoding;

$fp = fopen("./anhang/".$dbid."_".$i.".anhang","w+");

if ($encoding == 3) { fwrite($fp, base64_decode(imap_fetchbody($mbox, $mid, $partstring))); } else { fwrite($fp, imap_fetchbody($mbox, $mid, $partstring)); }



$dateiname = $parts[$i]->parameters[0]->value;

$dateigroesse = filesize("./anhang/".$dbid."_".$i.".anhang");

mysql_query("INSERT INTO mail_anhang (mbox,mid,dateiname,tempname,groesse) VALUES ('".$mailbox."', '".$dbid."', '".addslashes($dateiname)."', '".$i."', '".$dateigroesse."')");



}}

if ($parts[$i]->parts) { $stack[] = array("p" => $parts, "i" => $i); $parts = $parts[$i]->parts;

$i = 0; } else { $i++; }}}}



function decode_ISO88591($string) {

$string=str_replace("=?iso-8859-1?q?","",$string); $string=str_replace("=?iso-8859-1?Q?","",$string); $string=str_replace("?=","",$string); $charHex=array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");

for($z=0;$z<sizeof($charHex);$z++) { for($i=0;$i<sizeof($charHex);$i++) $string=str_replace(("=".($charHex[$z].$charHex[$i])),chr(hexdec($charHex[$z].$charHex[$i])),$string); }

//$string=nl2br($string); 
return($string);

}



$conf = array(); $conf[host] = $pop3host; $conf[username] = $pop3user; $conf[password] = $pop3pass; $conf[path] = './anhang';

$mbc = "{".$conf[host]."/pop3/notls:110}INBOX";

$mbox = imap_open($mbc, $conf[username], $conf[password]) or die ("Fehler:" .imap_last_error ());

$message_count = imap_num_msg($mbox);

for ($mid = 1; $mid <= $message_count; ++$mid) {

$header = imap_header($mbox, $mid);

$struct = imap_fetchstructure($mbox, $mid); $parts = $struct->parts; $i = 0;

if (!$parts) { 
   $attachment = array(); 
   $content = imap_body($mbox, $mid); 
   if($content!=transformHTML($content)) {
     $contenthtml=transformHTML($content);
     $m_format="html";
   }
} else {

$endwhile = false; $stack = array(); $content = ""; $attachment = array();


while (!$endwhile) {

if (!$parts[$i]) { if (count($stack) > 0) {

$parts = $stack[count($stack)-1]["p"]; $i = $stack[count($stack)-1]["i"] + 1;

array_pop($stack);

} else { $endwhile = true; }}

if (!$endwhile) {

$partstring = ""; foreach ($stack as $s) { $partstring .= ($s["i"]+1) . "."; } $partstring .= ($i+1);

if (strtoupper($parts[$i]->subtype)=="HTML") {
  $m_format="html";
}

if (strtoupper($parts[$i]->disposition) == "ATTACHMENT") { $attachment[] = array("filename" => $parts[$i]->parameters[0]->value); }

  if (strtoupper($parts[$i]->subtype) == "PLAIN") { 
    $content .= transformTEXT(imap_fetchbody($mbox, $mid, $partstring)); 
  }
  if (strtoupper($parts[$i]->subtype) == "HTML") {
    $contenthtml .= transformHTML(imap_fetchbody($mbox, $mid, $partstring)); 
  }

}

if ($parts[$i]->parts) {

$stack[] = array("p" => $parts, "i" => $i);

$parts = $parts[$i]->parts;

$i = 0;

} else { $i++; }}}

if (isset($header->from[0]->personal)) $absname = $header->from[0]->personal;

else $absname = $header->from[0]->mailbox;

if (isset($header->subject[0])) $betreff = $header->subject;

else $betreff = $header->Subject;

$betreff2 = imap_mime_header_decode($betreff);

$betreff = $betreff2[0]->text;

$mailbox=$header->to[0]->mailbox;

$absemail=$header->from[0]->mailbox."@".$header->from[0]->host;

if($contenthtml!="") {
  $content = decode_ISO88591($contenthtml);
} else {
  $content = decode_ISO88591($content);
}

$z=0; $spord=""; $fiar=file("spamwords.txt"); $spck=strtolower($content);

foreach($fiar as $spwo) {

$spwo=trim(strtolower($spwo));

if(preg_match("/$spwo/",$spck)) $spord="spam";

}

$ar=mysql_query("SELECT absname, autores, autorestxt FROM mail_user WHERE mbox='".$mailbox."'");
while($data=mysql_fetch_array($ar)) {
  if ($data[autores]==1) {
    $m_header="From: ".$data[absname]." <".$mailbox."@".$pop3domain.">";
    $m_betreff="Abwesenheitsnotiz";
    $m_body=str_replace("\r","",$data[autorestxt]);
    mail($absemail,$m_betreff,$m_body,$m_header);
  }
}

mysql_query("INSERT INTO mail_mails2 (mbox,absname,absemail,betreff,body,datum) VALUES ('".addslashes($mailbox)."', '".addslashes($absname)."', '".addslashes($absemail)."', '".addslashes($betreff)."', '".addslashes($content)."', '".time()."')");

mysql_query("INSERT INTO mail_mails (mbox,absname,absemail,betreff,body,datum,ordner, format) VALUES ('".addslashes($mailbox)."', '".addslashes($absname)."', '".addslashes($absemail)."', '".addslashes($betreff)."', '".addslashes($content)."', '".time()."', '".$spord."','".$m_format."')");

extract_attachments($mbox,$mid,mysql_insert_id(),$mailbox);

imap_delete($mbox, $mid);

}

imap_expunge($mbox);

imap_close($mbox);

$tsv7t=time()-604800;

$tsv3m=time()-7776000;

mysql_query("DELETE FROM mail_mails WHERE ordner < ".$tsv7t." AND ordner NOT LIKE '' AND ordner NOT LIKE 'archiv' AND ordner NOT LIKE 'spam'");

mysql_query("DELETE FROM mail_mails WHERE datum < ".$tsv7t." AND ordner='spam'");

mysql_query("DELETE FROM mail_mails WHERE datum < ".$tsv3m." AND ordner=''");

mysql_query("DELETE FROM mail_mails2 WHERE datum < ".$tsv3m." AND ordner=''");

?>

login.inc.php
PHP:
<table border=0 cellspacing=0 cellpadding=0 width=100% height=50px bgcolor=#2D4575>


<?php

$id=$_GET[id];

if($lg=="ok") {

echo "
<table border=0 cellspacing=0 cellpadding=0 width=1000>
<tr><td valign=top bgcolor=#FFFFFF>
<table border=0 cellspacing=0 cellpadding=4 width=100%>



<tr><td onmouseover=\"this.bgColor='#ECECEC'\" onmouseout=\"this.bgColor='#FFFFFF'\" onclick=\"location.href='index.php?l=spam';\" style=cursor:pointer><img src=images/exclamation.png width=16 height=16 align=absmiddle>&nbsp;Spamverdacht <span class=footer>(";



$us=mysql_query("SELECT id FROM mail_mails WHERE mbox='".$usrd[mbox]."' AND ordner='spam' AND gelesen=''");

$ust=mysql_query("SELECT id FROM mail_mails WHERE mbox='".$usrd[mbox]."' AND ordner='spam'");

echo "<b>".mysql_num_rows($us)."</b>/".mysql_num_rows($ust);



echo ")</span></td></tr>


echo "<b>Spam Filter</b><br><br><img src=images/spam.png width=16 height=16 align=absmiddle> <a href=index.php?l=spam&neu=1>Neuen Spam hinzufügen</a><br><br><table border=0 cellspacing=0 cellpadding=3 align=center width=100%>"; 

if($del!="") { 

mysql_query("DELETE FROM mail_spam WHERE mbox='".$usrd[mbox]."' AND id='".$del."'"); 

echo "<tr><td colspan=6 bgcolor=#E0F2D1><img src=images/tick.png width=16 height=16 align=absmiddle> <font color=darkgreen><b>Der Spam wurde erfolgreich gelöscht.</b></font></td></tr><tr><td colspan=6><img src=images/space.gif width=1 height=13></td></tr>"; 

} 

$getmm=mysql_query("SELECT * FROM mail_spam WHERE mbox='".$usrd[mbox]."' ORDER BY name DESC LIMIT $sza,10"); 

if(mysql_num_rows($getmm)==0) echo "<tr><td colspan=6 bgcolor=#B4EEB4><img src=images/cross.png width=16 height=16 align=absmiddle> <b><font color=red>Keine E Mail im Spam Filter gefunden.</font></b></td></tr>"; 

else { 

echo "<tr><td class=footer bgcolor=#B4EEB4>&nbsp;</td><td class=footer bgcolor=#B4EEB4><b>Name</b></td><td class=footer bgcolor=#B4EEB4 colspan=2><b>E-Mail</b></td></tr>"; 

while($getm=mysql_fetch_array($getmm)) { $icc++; 

echo "<tr><td colspan=6><img src=images/space.gif width=1 height=1></td></tr><tr onmouseover=\"this.bgColor='#E0F2D1'\" onmouseout=\"this.bgColor='#B4EEB4'\" bgcolor=#B4EEB4><td align=right><img src=images/user.png width=16 height=16></td><td class=small>".$getm[name]."</td><td class=small>".$getm[email]."</td><td align=right><a href=index.php?l=schreiben&b=".$getm[id]."><img src=images/email_go.png width=16 height=16 border=0 alt=\"E-Mail schreiben\" title=\"E-Mail schreiben\"></a><img src=images/space.gif width=5 height=16><a href=index.php?l=".$l."&del=".$getm[id]."><img src=images/cross.png width=16 height=16 border=0 alt=\"Spam löschen\" title=\"Spam löschen\"></a></td></tr>"; 

}} 

if(mysql_num_rows($getmm)!=0) { 

$next=$seite+1; $prev=$seite-1; 

echo "<tr><td colspan=6><img src=images/space.gif width=1 height=15></td></tr><tr><td colspan=3 bgcolor=white>"; 

if($seite>0) echo "<img src=images/v.gif align=absmiddle> <b><a href=index.php?l=".$l."&seite=".$prev.">Vorherige Seite</a></b>"; 

else echo "<img src=images/v2.gif align=absmiddle> <b><font color=#dcdcdc>Vorherige Seite</font></b>"; 

echo "</td><td colspan=3 bgcolor=white align=right>"; 

if($icc==10) echo "<b><a href=index.php?l=".$l."&seite=".$next.">Nächste Seite</a></b> <img src=images/n.gif align=absmiddle>"; 

else echo "<b><font color=#dcdcdc>Nächste Seite</font></b> <img src=images/n2.gif align=absmiddle>"; 

echo "</td></tr>"; 

} 

echo "</table>"; 

} 

} 


if($_POST[el]==1) mysql_query("UPDATE mail_user SET login='".time()."' WHERE id='".$usrd[id]."'");

}



echo "</td></tr></table>";

} else echo "<br><font size=5>Unerlaubter Zugriff</font>
<br><br><br>
<a href=index.php>Zur Startseite</a>";

?>

<?
include("footer.inc.php");
?>

Du bräuchtest daneben noch die Funktion, die das Eintragen neuer Spam-Mailadressen realisiert (also einen INSERT).

PHP:
if($neu!="") {

echo "<b>Neuen Spam Filter hinzufügen</b><br><br>";

if($a_email!="") {

mysql_query("INSERT INTO mail_aspam (mbox,name,email) VALUES ('".$usrd[mbox]."','".addslashes($a_name)."','".addslashes($a_email)."')");

echo "<img src=images/tick.png width=16 height=16 align=absmiddle> <font color=darkgreen><b>Spam Filter wurde erfolgreich hinzugefügt.</b></font>";

} else echo "<form action=index.php method=post><input type=hidden name=l value=adressbuch><table border=0 cellspacing=0 cellpadding=5><tr><td class=footer><b>Name:</b></td><td><input type=text name=a_name style=width:250px value=\"".$neuname."\"></td></tr><tr><td class=footer><b>E-Mail:</b></td><td><input type=text name=a_email style=width:250px value=\"".$neuemail."\"></td></tr><tr><td colspan=2 align=right><input type=submit value=Speichern></td></tr></table>";

Meinst du INSERT sollte ich den PHP Inhalt hinzufügen?

Danke für deine schnelle Antwort.

MfG
 
Und wo ist jetzt das Problem, wenn du das Eintragen einer neuen zu filternden Adresse schon implementiert hast?
 
Weil es nicht funktioniert, da ist ilgendwo ein Fehler drinne.

So zu sagen er blockt nicht die E Mail Adressen.
 
Zuletzt bearbeitet:
Also ohne ordentliche Kommentierung werde ich den Quellcode nicht durchwelzen ;)
Wie funktioniert denn dein Mailsystem genau? Also wie ist zum Beispiel der Ablauf bei einer eingehenden Email?
 
Weil es nicht funktioniert, da ist ilgendwo ein Fehler drinne.

So zu sagen er blockt nicht die E Mail Adressen.

Oh, sehr gute Fehleranalyse. Zumal du vielen unübersichtlichen Code postest.
Ganz ehrlich, bei diesem undokumentierten und unformatierten Code findet man keine Fehler einfach mal so am Wegrand.
Dein Code ist so geschrieben, dass man Klammern zählen muss um herauszufinden welche Schleife wo endet, was in welchem if() drin ist etc.
Das sauberer Formatieren ist der erste Schritt zur Fehlerfindung:
Mehr dazu: PHP High Quality PHP-Code – Teil 1 Code-Style

Der Zweite geht über debuggen um herauszufinden wo der Schuh drückt. Damit man das Problem auf wenige Zeilen eingrenzen kann.
PHP Debuggen mit var_dump()
PHP MySQL Debug Queries
 
Zurück