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.
#!/opt/local/bin/php
$imapServer = "imap.server.tld";
$imapPort = 143;
$imapPath = "/imap/notls";
$imapMailbox = "INBOX";
$imapUsername = "login@server.tld";
$imapPassword = "password";
echo date("d-m-Y h:i:s")." :: [Started spam filter]n";
$mbox = imap_open("{".$imapServer.":".$imapPort.$imapPath."}".$imapMailbox, $imapUsername, $imapPassword) or die("can't connect: " . imap_last_error());
$obj = imap_check($mbox);
// Loop thru messages in INBOX
$result = imap_fetch_overview($mbox,"1:{$obj->Nmsgs}",0);
foreach ($result as $overview) {
$junk = 0; // reset counter to zero
$move = "INBOX.Spam";
$arrSeen = array("N", "R");
$seen = $overview->seen;
$msgno = $overview->msgno;
$from = $overview->from;
$raw = imap_fetchheader($mbox, $msgno, FT_INTERNAL);
//spam filters (do a number of checks that only occures in spam mail)
#if(eregi("mail3.surf-town.net$", $from)) { $junk = $junk + 1; } // add value of 1 (as sign of junk)
if(!eregi("@", $from)) { $junk = $junk + 1; } // add value of 1 (as sign of junk)
if(eregi("(Received-SPF:)*[pass|neutral]", $raw)) { $junk = $junk + 1; } // add value of 1 (as sign of junk)
echo $from." -> ".$move." [spam: $junk]n"; // debug line, shows all messages in mailbox
// do check if marked as spam and move to INBOX.Spam mailbox
if ($junk >= 1) {
imap_mail_move($mbox, $msgno, $move); // move messages having $junk value bigger then 0 to INBOX.Spam
}
}
imap_expunge($mbox); // apply changes to mailboxes
imap_close($mbox);
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.