Frasortering af spam med PHP og IMAP

I går skrev jeg hvordan man får IMAP til at fungere med PHP eller rettere sagt, hvordan man konfigurere PHP til at understøtte IMAP-protokol.

Grundet hvorfor jeg havde brug for det, var pga. denne script. Jeg ville lave en spam filter som vil sortere spam væk fra min indbakke. Jeg valgte at gør dette med IMAP da dette vil tillade mig at filtrere spam uden at slette det. Da denne filter eller rettere script er meget firkantet i hvad den finder som spam eller legitimt mail. Så jeg havde brug for, ikke at slette mails, men bare flytte dem i en anden mappe, hvor jeg vil kunne gå ind og tjekke om der er nogle false positives. Og det vil der altid være.

Denne script gør brug af mail headers for at se om mailen er sendt fra en mail server som den selv udgiver sig at være. Så hvis den finder SPF header hvor der står andet end pass eller neutral, vil den markere mail som spam.

  1. #!/opt/local/bin/php
  2. $imapServer = "imap.server.tld";
  3. $imapPort = 143;
  4. $imapPath = "/imap/notls";
  5. $imapMailbox = "INBOX";
  6. $imapUsername = "login@server.tld";
  7. $imapPassword = "password";
  8. echo date("d-m-Y h:i:s")." :: [Started spam filter]n";
  9. $mbox = imap_open("{".$imapServer.":".$imapPort.$imapPath."}".$imapMailbox, $imapUsername, $imapPassword) or die("can't connect: " . imap_last_error());
  10. $obj = imap_check($mbox);
  11. // Loop thru messages in INBOX
  12. $result = imap_fetch_overview($mbox,"1:{$obj->Nmsgs}",0);
  13. foreach ($result as $overview) {
  14. $junk = 0; // reset counter to zero
  15. $move = "INBOX.Spam";
  16. $arrSeen = array("N", "R");
  17. $seen = $overview->seen;
  18. $msgno = $overview->msgno;
  19. $from = $overview->from;
  20. $raw = imap_fetchheader($mbox, $msgno, FT_INTERNAL);
  21. //spam filters (do a number of checks that only occures in spam mail)
  22. #if(eregi("mail3.surf-town.net$", $from)) { $junk = $junk + 1; } // add value of 1 (as sign of junk)
  23. if(!eregi("@", $from)) { $junk = $junk + 1; } // add value of 1 (as sign of junk)
  24. if(eregi("(Received-SPF:)*[pass|neutral]", $raw)) { $junk = $junk + 1; } // add value of 1 (as sign of junk)
  25. echo $from." -> ".$move." [spam: $junk]n"; // debug line, shows all messages in mailbox
  26. // do check if marked as spam and move to INBOX.Spam mailbox
  27. if ($junk >= 1) {
  28. imap_mail_move($mbox, $msgno, $move); // move messages having $junk value bigger then 0 to INBOX.Spam
  29. }
  30. }
  31. imap_expunge($mbox); // apply changes to mailboxes
  32. imap_close($mbox);
  33. exit(0);

Dette script, kan kaldes fra terminalen manuelt, eller som cron job hvor den vil sørge for at din indbakke ikke indholder spam. Det skal også siges, at man skal bruge det på egen hånd, jeg fratager mig al ansvar hvis du mister dine mails eller lign.