Andy1988
08-12-2006, 22:45
Hallo,
Ich schreib mir grade ein Script, dass alle Mails in bestimmten Ordnern meiner Mailboxen in nen Temp-Ordner verschiebt und dann dem Spamassasin diese Mails als Spam beibringt.
Um jede Mailbox bei jeder Domain zu durchlaufen brauche ich 3 oder 4 Schleifen, bei denen halt die Ordner durchsucht werden.
Jetzt hab ich das Problem, dass PHP bei der letzten Schleife mit der Fehlermeldung "Warning: readdir(): 7 is not a valid Directory resource in /root/sa-learn.php on line 40" abbricht.
Ich schließe den Filehandler vorher auch nicht. Wenn ich ihn mit echo ausgeben lasse, erhalte ich "Resource id #7". Sollte stimmen.
Gibts da irgendwie ne Begrenzung wie viele Filehandler man öffnen kann in PHP? Aber wenn ja, dann liegt die doch nicht bei 3 oder 4 oder?
Und das System selber kann auch nicht so viele Handler offen haben.
In der Config hab ich nichts dazu gefunden.
Hier mein Script... Die Kommentare sind mal Englisch, mal Deutsch. Nicht gut, aber ich bin ja auch noch nicht fertig mit dem Script:
#!/usr/bin/php
<?php
###################### CONFIG ######################
$tmpdir = "/tmp/salearn"; #WITHOUT slash at the end
$maildir = "/home/vmail"; #WITHOUT slash at the end
###################### SCRIPT ######################
//Don't edit anything unless you know what you are doing!
echo "Starting sa-learn.php at " . date("j.n.y H:i:s") . "\n";
echo "Creating " . $tmpdir . " and subdirs\n";
mkdir($tmpdir);
mkdir($tmpdir . "/ham");
mkdir($tmpdir . "/spam");
echo "Moving all Messages into temporary Folders\n";
if($dir = opendir($maildir))
{
while(($domaindir = readdir($dir)) != false) //Alle Domains durchgehen
{
if($domaindir != "deleted-maildirs" && is_dir($maildir . "/" . $domaindir) && $domaindir != "." && $domaindir != "..") //Nur Ordner und nicht deleted-maildirs
{
echo $domaindir . "\n";
if($accounts = opendir($maildir . "/" .$domaindir))
{
while(($accountdir = readdir($accounts)) != false) //Alle Accounts durchgehen
{
if(is_dir($maildir . "/" . $domaindir . "/" . $accountdir) && $accountdir != "." && $accountdir != "..") //Nur Verzeichnisse
{
echo $accountdir . "\n";
if(file_exists($maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam")) //Only go on if spam learning dir exists
{
if($mails = opendir($maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam/cur")) //Open Spamdir for learning
{
echo $mails."\n";
echo $maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam/cur";
while(($mail = readdir($mails)) != false)
{
if(!is_dir($maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam/cur/" . $mail))
{
//copy($maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam/cur/" . $mail, $tmpdir . "/spam");
}
closedir($mails);
}
}
else
echo "ERROR while opening Maildir " . $maildir . "/" .$domaindir . $accountdir . "/.Spam.Learn-Spam/cur";
}
else
echo "INFO: Spam learning dir doesn't exist in " . $maildir . "/" . $domaindir . "/" . $accountdir . "\n";
}
}
closedir($accounts);
echo "closed accounts\n";
}
else
echo "ERROR while opening Maildir " . $maildir . "/" .$domaindir;
}
}
closedir($dir);
echo "closed dir\n";
}
else
echo "ERROR while opening Maildir " . $maildir;
echo "Cleaning up...\n";
recursiveRemoveDirectory($tmpdir);
function recursiveRemoveDirectory($path)
{
$dir = new RecursiveDirectoryIterator($path);
foreach(new RecursiveIteratorIterator($dir) as $file)
{
unlink($file);
}
foreach($dir as $subdir)
{
if(!@rmdir($subdir))
{
recursiveRemoveDirectory($subdir);
}
}
rmdir($path);
}
?>
Ich schreib mir grade ein Script, dass alle Mails in bestimmten Ordnern meiner Mailboxen in nen Temp-Ordner verschiebt und dann dem Spamassasin diese Mails als Spam beibringt.
Um jede Mailbox bei jeder Domain zu durchlaufen brauche ich 3 oder 4 Schleifen, bei denen halt die Ordner durchsucht werden.
Jetzt hab ich das Problem, dass PHP bei der letzten Schleife mit der Fehlermeldung "Warning: readdir(): 7 is not a valid Directory resource in /root/sa-learn.php on line 40" abbricht.
Ich schließe den Filehandler vorher auch nicht. Wenn ich ihn mit echo ausgeben lasse, erhalte ich "Resource id #7". Sollte stimmen.
Gibts da irgendwie ne Begrenzung wie viele Filehandler man öffnen kann in PHP? Aber wenn ja, dann liegt die doch nicht bei 3 oder 4 oder?
Und das System selber kann auch nicht so viele Handler offen haben.
In der Config hab ich nichts dazu gefunden.
Hier mein Script... Die Kommentare sind mal Englisch, mal Deutsch. Nicht gut, aber ich bin ja auch noch nicht fertig mit dem Script:
#!/usr/bin/php
<?php
###################### CONFIG ######################
$tmpdir = "/tmp/salearn"; #WITHOUT slash at the end
$maildir = "/home/vmail"; #WITHOUT slash at the end
###################### SCRIPT ######################
//Don't edit anything unless you know what you are doing!
echo "Starting sa-learn.php at " . date("j.n.y H:i:s") . "\n";
echo "Creating " . $tmpdir . " and subdirs\n";
mkdir($tmpdir);
mkdir($tmpdir . "/ham");
mkdir($tmpdir . "/spam");
echo "Moving all Messages into temporary Folders\n";
if($dir = opendir($maildir))
{
while(($domaindir = readdir($dir)) != false) //Alle Domains durchgehen
{
if($domaindir != "deleted-maildirs" && is_dir($maildir . "/" . $domaindir) && $domaindir != "." && $domaindir != "..") //Nur Ordner und nicht deleted-maildirs
{
echo $domaindir . "\n";
if($accounts = opendir($maildir . "/" .$domaindir))
{
while(($accountdir = readdir($accounts)) != false) //Alle Accounts durchgehen
{
if(is_dir($maildir . "/" . $domaindir . "/" . $accountdir) && $accountdir != "." && $accountdir != "..") //Nur Verzeichnisse
{
echo $accountdir . "\n";
if(file_exists($maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam")) //Only go on if spam learning dir exists
{
if($mails = opendir($maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam/cur")) //Open Spamdir for learning
{
echo $mails."\n";
echo $maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam/cur";
while(($mail = readdir($mails)) != false)
{
if(!is_dir($maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam/cur/" . $mail))
{
//copy($maildir . "/" . $domaindir . "/" . $accountdir . "/.Spam.Learn-Spam/cur/" . $mail, $tmpdir . "/spam");
}
closedir($mails);
}
}
else
echo "ERROR while opening Maildir " . $maildir . "/" .$domaindir . $accountdir . "/.Spam.Learn-Spam/cur";
}
else
echo "INFO: Spam learning dir doesn't exist in " . $maildir . "/" . $domaindir . "/" . $accountdir . "\n";
}
}
closedir($accounts);
echo "closed accounts\n";
}
else
echo "ERROR while opening Maildir " . $maildir . "/" .$domaindir;
}
}
closedir($dir);
echo "closed dir\n";
}
else
echo "ERROR while opening Maildir " . $maildir;
echo "Cleaning up...\n";
recursiveRemoveDirectory($tmpdir);
function recursiveRemoveDirectory($path)
{
$dir = new RecursiveDirectoryIterator($path);
foreach(new RecursiveIteratorIterator($dir) as $file)
{
unlink($file);
}
foreach($dir as $subdir)
{
if(!@rmdir($subdir))
{
recursiveRemoveDirectory($subdir);
}
}
rmdir($path);
}
?>