aurascalarasi09 Posted January 26, 2011 Report Posted January 26, 2011 Cum PHP nu ofera o solutie pentru limitarea numarului de mailuri trimise cu functia mail() si in majoritatea cazurilor spamerii folosesc functia mail() trebuie gasita o solutie de a limita numarul de mailuri trimise de un utilizator. Am facut un misc script in Perl care face asta. Modul de functionare e relativ simplu, scriptul este apelat de PHP la trimiterea unui mail. In script se fac niste verificari si daca userul a trimis mai putin de 200 de mailuri (se poate schimba) in ziua respectiva mesajul este trimis. In caz contrar mesajul este ignorat. Cod: #!/usr/bin/perl # # © FearDotCom# use POSIX; use define LIMITA => 200; if($> != 0 ) { my $count=0; if( open(LOG,"/var/log/phpmail.log") ){ while(<LOG>){ if( $_ =~ /$>/ ){ $count++; } } close(LOG); } if( open(LOG,">>/var/log/phpmail.log") ){ my $sender = getcwd.$ENV{'SCRIPT_FILENAME'}; my $data = `date`; chomp $data; if( $count > LIMITA ){ print LOG "$data:$>:$sender:ignored \n"; }else{ print LOG "$data:$>:$sender:sent \n"; exec {"/usr/sbin/sendmail"} ('/usr/bin/sendmail',@ARGV); } close(LOG); } }else{ exec {"/usr/sbin/sendmail"} ('/usr/bin/sendmail',@ARGV); } Cum este un hack, nu o solutie oferita de distribuitor, trebuie facute cateva mici modificari pentru ca scriptul sa functioneze corect: 1. Se creaza fisierul /var/log/phpmail.log caruia i se pun permisiunile corecte (rw-rw-rw-); 2. Se creaza un cron care in fiecare zi, la ora 00:00, goleste continutul fisierului phpmail.log ( cp /dev/null /var/log/phpmail.log ) - optional se poate face un script care pastreaza fisierele vechi; 3. Se salveaza codul de mai sus in /usr/bin/sendmail, fisier caruia i se da drept de executie - 755; 4. Se modifica in php.ini directiva sendmail_path sa pointeze catre /usr/bin/sendmail, nu catre /usr/sbin/sendmail (observat bin in loc de sbin) cum e default; 5. Modificati use define LIMITA => 200; sa corespunda unei valori care o considerati optima; Daca astea sunt facute nu mai trebuie nici o modificare (nici macar restart).SURSA: tutoriale4u Quote