Tjena
Jag har lite problem med en funktion för Nyhetsbrevsutskick som började strula igår.
Koden ser ut såhär (bygger på PHP Mailer):
<?php
if(!empty($_GET['send'])) {
$htmlbody = file_get_contents("membermail/{$_GET['send']}.htm");
$alt_body = file_get_contents("membermail/{$_GET['send']}.txt");
$subject = file_get_contents("membermail/{$_GET['send']}.subject");
$mail = new PHPMailer();
$mail->Subject = $subject;
$mail->From = $email;
$mail->FromName = "******.**";
$mail->Host = "mailout.*****.**";
$mail->Mailer = "smtp";
$mail->Body = $htmlbody;
$mail->AltBody = $alt_body;
if(!isset($_GET['start_id']))
$start_id = 1;
else
$start_id = $_GET['start_id'];
$batch_limit = 100;
//TA UT SISTA id som ska ha medlemsmail
$query = "SELECT id FROM " . TABLE_USERS . " WHERE membermail = 1 ORDER BY id DESC LIMIT 1";
$result = mysql_query($query) or exit(mysql_error());
$last_id = mysql_result($result, 0);
//TA ut n nästa
$query = "SELECT email,id FROM " . TABLE_USERS . " WHERE membermail = 1 AND id >= $start_id LIMIT $batch_limit";
$result = mysql_query($query) or exit(mysql_error());
$n = 1;
while ($row = mysql_fetch_array($result)) { // Denna loop skickar ut mailen till alla emailadresser
$email = $row["email"];
$mail->AddAddress($email);
//echo $email . "<br />";
@$mail->Send();
usleep(2000000);
// Clear all addresses and attachments for next loop
$mail->ClearAddresses();
$mail->ClearAttachments();
$end_id = $row['id'];
} //END OF WHILE
$delay = 15;
if($end_id!=$last_id) { //REDIRECT TO NEXT BATCH
$percentage_done = round((($end_id / $last_id)*100),0) . "%";
$tpl->set('submitted', TRUE);
$tpl->set('message', "<p>Var vänlig vänta under tiden medlemmsmailet skickas ut. <br />($delay sekunders intervaller)<br /><br />" . $percentage_done . '</p>');
echo "<META HTTP-EQUIV=Refresh CONTENT=\"{$delay}; URL=./?a=membermail&send={$_GET['send']}&start_id={$end_id}\">";
} else if($end_id==$last_id) { //WHEN DONE
$tpl->set('submitted', TRUE);
$tpl->set('message', $language['__membermail']['submitted']);
}
}
?>
Meningen är att det ska gå ut till ca. 5000 kunder, men vid första försöket igår gick det bara ut till ca. 5% och sen gjorde det timeout.
Vi har varit i kontakt med B-One där sajten ligger och dom säger att det säkert beror på att servern gör timeout.
Så, går det att justera något i scriptet för att undvika det här?
Det gör ingenting om själva utskicket tar längre tid, bara alla mail går iväg schysst.
Om jag inte är helt körd såhär i slutet på veckan, visst får alla exakt samma innehåll? Då är det väl mycket smartare att göra en lista av mottagare som du sätter som BCC, och sen skickar ett enda mail till alla mottagare.