» Utilizator
Salut, vizitatorule!

SkullBox este o comunitate formata din programatori si administratori de sisteme sau retele care iti sta la dispozitie cand ai o problema legata de calculatoare. Daca esti un utilizator existent, autentifica-te.

Daca nu te-ai inregistrat inca pe forum, alatura-te noua astfel marind comunitatea si ajutandu-i pe cei care au nevoie de informatii.

Daca te-ai inregistrat dar inca nu ai primit codul de activare, il poti cere aici.




Autentifica-te cu numele de utilizator si parola pentru a putea posta pe forum sau pentru a accesa ariile disponibile doar utilizatorilor inregistrati.
» Promovam
» Parteneri » Statistici
  • 59734 de mesaje.
  • 7149 de topicuri.
  • 1005 de utilizatori.
  •  
  • Usellexelty e ultimul utilizator inregistrat.
[Detalii]

 
Pagini: [1]
Print
Cum limitam functia mail() din PHP [804 afisari]
Agkelos
*


Mesaje: 6708
OfflineOffline

WWW

Nu e tocmai un snippet, dar cred ca aici se incadreaza cel mai bine si postez in ideea ca poate cineva are nevoie de o solutie de genul asta.

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 mic 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.

Codul il aveti mai jos:
Code:
#!/usr/bin/perl
#
# (C) Agkelos, webmaster@aberez.eu
#

use Cwd;
use POSIX;
use define LIMITA => 200;

if($> != 0 ) {
        my $sender = getcwd.$ENV{'SCRIPT_FILENAME'};
        if( $sender =~ /\/home\/([a-zA-Z0-9]+)/ ){
                $user = $1;
        }
        my $count=0;
        if( open(LOG,"/var/log/phpmail.log") ){
                while(){
                        if( $_ =~ /$user/ ){
                                $count++;
                        }
                }
                close(LOG);
        }

        if( open(LOG,">>/var/log/phpmail.log") ){
                my $data = `date`;
                chomp $data;
                if( $count > LIMITA ){
                        print LOG "$data:$user:$sender:ignored \n";
                }else{
                        print LOG "$data:$user:$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).
Logged

SkullBox Blogger | LAMP Blogger | Web aggregator

De nu va zice omul intru inima sa "Eu singur si Dumnezeu suntem in lume" nu va avea odihna. - Avva Alonie
09-02-2008, 10:56 Twitt ::
Reclama
VIP

Hosting

Mesaje: 25.90
OnlineOnline

WWW
 

   Pe ABCDomenii: 250MB spatiu + 20GB trafic + 5 subdomenii = 0.95 €
 
 

The problem with troubleshooting is that trouble shoots back.
Azi 
Pages: [1]
Print
SkullBox Forum  |  Development  |  Web Development  |  Perl snippets (Moderator: payne)  |  Topic: Cum limitam functia mail() din PHP
Jump to: