Ik heb een eenvoudig formulier dat dient om mails te sturen naar emailadressen die staan opgeslagen in een database.
Het formulier laat toe om een selectie te maken van groepen. Bijvoorbeeld het eerste leerjaar, het tweede leerjaar,... Na het verzenden komt er een tabel op het scherm met de emailadressen en namen van personen naar wie de mails zijn verstuurd.

Het loopt echter een beetje fout als ik iedereen selecteer. Een groep bestaat uit maximum 30 e-mailadressen. 'Iedereen' selecteren is echter een 500-tal e-mails dat worden verstuurd. Na het verzenden, moet ik even wachten (mails worden dan verstuurd), maar daarna kom ik niet op de pagina waar de tabel met namen en adressen staat, maar krijg ik een white screen of death. Er worden echter wel mails verstuurd, maar ik weet niet ofdat iedereen de mail wel heeft aangekregen.


Hieronder een stuk van mijn code:
<?php
if($naar=="Alle leden"){
$leden=mysql_query("SELECT Naam, Voornaam, Email FROM Leden WHERE ($seizoen='Ja' || $seizoen='Neen')");
while($lid=mysql_fetch_array($leden)){
$naam=$lid['Naam'];
$voornaam=$lid['Voornaam'];
$email=$lid['Email'];
if(mail($email, $onderwerp, $msg, $headers)==true){
$succes=true;
}
else{
$succes=false;
}
$maillist[]=array("$naam","$voornaam","$email","$succes");
}
}
?>


Deze code werkt perfect met een klein aantal e-mail adressen. Ik vermoed dat de mail-functie in php het probleem veroorzaakt, omdat die bij elke mail zijn protocols opent en sluit. Hierdoor duurt het tamelijk lang voordat de browser verder kan en er waarschijnlijk een time-out error wordt gecreeerd. Maar hiervan heb ik geen kennis.

Kan iemand mij hierbij helpen?

Alvast bedankt

Steven
Waar kom $naar vandaan?

Verder is het geen 'white screen of death' omdat het script geen fatale fout uit zijn eigen maakt. Dus ik noem het gewoon een 'blank screen'
Zet dit bovenin je script:
<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
?>
Die $naar komt van een $_POST, hierin staat naar welke groep (of alle leden) er een mail moet worden gestuurd.


Ik kan dat wel in mijn script zetten, maar het probleem is dat ik het formulier niet kan testen zonder 500 mensen lastig te vallen. Dus dat is niet echt een oplossing.
Comment regel 8 t/m 13 eens uit.
Werkt het dan wel?
Zo ja, dan vermoed ik dat php een timeout krijgt.
Of een debug-switch inbouwen en al die mails in dat geval naar een eigen aangemaakte mailbox sturen?
Ik raad aan om na elke 10 mails even een wachtpauze van enkele seconden in te bouwen. Of beter zelfs, gebruik te maken van PHPmailer en dan per 20 mails over een enkele mail met BCC verdelen.

Dan hoef je er maar 25 mails voor uit te schieten.

Let er wel op dat PHP een max_execution kent.
Wat geeft dit aan?
<?php
echo ini_get('max_execution_time');
?>
Ja, dan werkt het direct. Ik krijg de volledige lijst met namen.

Hoe kan ik de php time-out oplossen?
Op hoeveel staat deze nu, volgens mijn script?

Je kan hem verlengen door dit bovenaan te plaatsen:
<?php ini_set('max_execution_time', 300);
// 300 sec = 5 min.
?>

Persoonlijk raad ik wel aan om per mailadres bij te houden of de mail al verstuurd is. Als je script nu onderbroken wordt, dan weet je nu niet meer wie een mail gehad heeft, en moet je sommige mensen teisteren met dubbele mails.
Standaard stond hij blijkbaar op 50. Nu op 300.

Probleem is dat ik het echt niet kan testen, of ik moest een groep aanmaken met allemaal valse e-mailadressen.


Ik hoop dat het hiermee opgelost is. Zal het laten weten als ik het nog eens nodig heb gehad.

1000 keren bedankt in ieder geval
Test anders eens met alleen een sleep(320), die dus langer is dan de executiontime.
Dan zal je ook kunnen uitzoeken of de executiontime echt werkt ;-)

Reageren