PDA

Bekijk Volledige Versie : gebruik php mail() limiteren



smurf
02/06/07, 14:24
Het gebeurt de laatste tijd te frequent dat klanten het blijkbaar normaal vinden op hun shared hosting mailings naar 80K reciepients uit te sturen.

Mails zijn uiteraard 'legitiem' en worden dus niet tegengehouden door de filters op de externe mail relay en hierdoor lopen de mail queues vol op de verschillende mailservers. Ik kan gaan filteren op de smtp connecties per seconde van de verzendende mailserver naar de relay maar wanneer een bepaalde server aan zijn limiet zit worden de andere klanten ook gehinderd. Er moet dus op een lager niveau een filter komen.

Nu, in geval van dergelijke mailing wordt die - van zodra opgemerkt - gestopt en de klant wordt verwittigd / gesuspended. Maar in plaats van pas na de feiten het probleem aan te pakken wil ik het gewoon proactief vermijden en een limiet stellen op het aantal mails die per uur uitgezonden mogen worden.

Heb nog niet direct iets gevonden via google, ik kan evt zelf een sendmail wrapper schijven en zo limiteren maar als het al zou bestaan of er een betere oplossing is ga ik mijn tijd daar niet insteken.

- Is er hier een php patch voor gekend?
- Iemand een sendmail wrapper die dat doet?

Graag uw suggesties.

IT-worX
02/06/07, 14:28
Misschien een stomme opmerking...maar het is het eerste wat mij binnenschiet...

Eventueel een limiet van aantal connecties per seconde? Onder een bepaald aantal connecties onmiddellijk versturen, indien omhoog wachten tot een bepaald rustiger punt s nachts. Dan zouden andere klanten er ook geen last van hebben. En dit punt opnemen in je algemene voorwaarden...

Don't shoot, just an idea :)

smurf
02/06/07, 14:35
Staat al in de voorwaarden, maar voorwaarden alleen volstaan niet dat mensen zich er aan houden. Limiet op connectie per ip is ook niet haalbaar omdat andere klanten mogelijks van dezelfde mailserver gebruikmaken als de persoon die zijn shared hosting gebruikt voor bulk mailings.

Ramon Fincken
02/06/07, 14:38
ik heb een cron batched php mailer die gebruik maakt van een mailer class file.

wellicht iets om in te zien ?

Arieh
02/06/07, 15:22
Misschien dat http://help.directadmin.com/item.php?id=81 handig is? Is niet specifiek voor php natuurlijk, en weet ook niet of hij wel kan zien welke user mail() gebruikt.

smurf
02/06/07, 15:26
We gebruiken geen exim dus geen optie helaas

SebastiaanStok
02/06/07, 16:31
Je kan bij php.ini instellen wat je send_mail path moet zijn.
Als je dan zelf een programma schrijft dan kan je door middel van de uid (als die verschillend is) kijken wie die email wild verzenden.

Als je weet van wie het is, is het enkel nog een kwestie van bijhouden hoeveel email hij/zij binnen een uur heeft verzonden. Als ze dan het limiet heeft bereikt laat je het programma een fout geven dat het limiet is bereikt.

Ik heb een keer een artikel gelezen hier over, echter was dit bedoeld als spamfilter, maar het principe is het zelfde :)
http://www.webhostgear.com/232.html

Kan natuurlijk net zo goed met php, C(++) of wat je zelf wild.

thunder
02/06/07, 16:34
welke mailserver gebruik je? ik d8 dat je bv. in postfix een limiet op het max. aantal mails kon zetten, maar dat is dan nog een oplossing vrees ik

smurf
02/06/07, 16:44
qmail

http://www.webhostgear.com/232.html was ik al tegengekomen, logt gewoon de paden van de scripts die mailen, is niet preventief...

Mikej0h
02/06/07, 18:23
Een andere oplossing waar je over na zou kunnen denken is de volgende;
In de php.ini is het mogelijk een SMTP server op te geven, naar mijn weten ook met een poort.

Wat je zou kunnen doen is dat je op je uitgaande mailserver een tweede sendmail/postfix/exim/qmail gebruikt op een ongewone poort (poort 7999 ofzo). En die configureert in de php.ini's op je webservers. Op deze manier hebben je gewone e-mail klanten er geen last van.

Randy
02/06/07, 18:36
Had Wido hier laatst geen plugin voor gemaakt, een soort virtuele sendmail?

smurf
02/06/07, 18:42
Een andere oplossing waar je over na zou kunnen denken is de volgende;
In de php.ini is het mogelijk een SMTP server op te geven, naar mijn weten ook met een poort.

Wat je zou kunnen doen is dat je op je uitgaande mailserver een tweede sendmail/postfix/exim/qmail gebruikt op een ongewone poort (poort 7999 ofzo). En die configureert in de php.ini's op je webservers. Op deze manier hebben je gewone e-mail klanten er geen last van.

Je kan enkel SMTP servers opgeven in Windows, onder linux is dit geen oplossing.

Nu ja, heb het al opgelost:

mv /usr/sbin/sendmail /usr/sbin/sendmail.hidden
chmod +x /usr/sbin/sendmail.hidden

Log files aanmaken ( /var/log/spam_log en /var/log/sender_log )

#!/usr/bin/perl

# use strict;
use Env;
my $date = `date`;
chomp $date;
open (INFO, ">>/var/log/spam_log") || die "Failed to open file ::$!";
open (SENDER, ">>/var/log/sender_log") || die "Failed to open file ::$!";
my $uid = $>;
my @info = getpwuid($uid);
my $mailprog = '/usr/sbin/sendmail.hidden';

foreach (@ARGV) {
$arg="$arg" . " $_";
}

print SENDER "$PWD \n";
$count = `grep $PWD /var/log/sender_log | wc -l`;

if ($count < 500) {
open (MAIL,"|$mailprog $arg") || die "cannot open $mailprog: $!n";
while (<STDIN> ) {
print MAIL;
}
}
else {
print INFO "$date $PWD reached limit \n";
}
close (INFO);
close (SENDER);
close (MAIL);


roteer /var/log/sender_log om het uur en één script kan slechts 500 mails per uur uitsturen.

Kan evt aangepast worden om nog andere checks uit te voeren.

mind
02/06/07, 19:48
bedoel je zo iets?

http://www.milter.info/sendmail/milter-limit/

Edit: Laat maar ik lees net dat je qmail gebruikt en die kan niets met een milter voor zo ver ik weet.

SebastiaanStok
02/06/07, 20:35
Misschien kan ik morgen iets schrijven in php waarmee hij gecontroleerd of hoeveel emails er al zijn verzonden.

Alleen moet ik een dingetje weten, draaien de php scripts onder een aparte user dan apache/www/nobody? Anders kan je misschien door het middel van de locatie van het uitvoerde script bepalen wie het uitvoert.

Werk je met DirectAdmin of iets dergelijks :)

smurf
02/06/07, 20:51
Het is al in orde hoor, bedankt om mee te denken.

Setup die dergelijke limiet moest krijgen draait op plesk (plesk en qmail).


Heb http://www.webhostgear.com/232.html gewoon aangepast zodat het doet wat ik wil brereiken.