Hallo,
ich schreibe an einem Newslettertool, habe aber das Problem das scheinbar alles richtig funktioniert, aber es werde mehr Newsletter versendet als in der Datenbank Empfänger stehen.
Es bekommen also Empfänger Ihre Emails mehr als doppelt, der Rekord liegt bei 12 Stück auf eine Email.
Als ersters mal den Code:
Das ganze funktioniert nach Kundengruppen.
In der einen Gruppe sind 6500 Empfänger, in der anderen Gruppe sind 50.
Wenn ich die Gruppe mit 50 auswähle, dann bekomme ich 50 Emails aber wenn ich die 6500 Gruppe auswähle bekomme ich ca 10.000 Emails.
Die Funktionsweise ist so, dass wenn ein Newsletter gesendet wird, die Tabelle mit den Empfängern kopiert wird und die Abfrage der Empfänger aus der kopierten Tabelle gemacht wird.
Bei jedem durchlauf wird dann die gerade behandelte Emailadresse aus der temporären Tabelle gelöscht, so das eigentlich keine Emails doppelt rausgehen dürften.
Ich lasse den Versand allerdings mit einem Cronjob aufrufen, jede Stunde. Damit auch abgebrochene Newsletter versendet werden.
Die Scriptlaufzeit habe ich abgeschaltet, so dass das Script zumindest nicht durch eine Laufzeitbeschränkung abgebrochen wird.
Ist es möglich, dass sich die Cronjobs addieren? Also das wenn der eine noch läuft und das Script wird von einem neuen aufgerufen, dass es dann zu duplikaten kommen kann, weil sie gerade an der selben Stelle sind?
Vielen Dank für Eure Hinweise.
Michael
ich schreibe an einem Newslettertool, habe aber das Problem das scheinbar alles richtig funktioniert, aber es werde mehr Newsletter versendet als in der Datenbank Empfänger stehen.
Es bekommen also Empfänger Ihre Emails mehr als doppelt, der Rekord liegt bei 12 Stück auf eine Email.
Als ersters mal den Code:
PHP-Code:
//Holen der Newsletterempfänger aus der gewählten Kundengruppe
$sql_data_query = mysql_query(" select *
from EG_newsletter_".$_SESSION['newsletter']['id']."
where customers_status = '".$group."'
");
//Variable leeren, zur Zählung gesendeter Emails
$count_mails = 0;
$i = 1;
//Initialisierung der Emailsende-Klasse
//Create the Transport
$transport = Swift_SmtpTransport::newInstance($config['5'], 25)
->setUsername($config['2'])
->setPassword($config['3'])
;
$mailer = Swift_Mailer::newInstance($transport);
//Or specify a time in seconds to pause for (30 secs)
$mailer->registerPlugin(new Swift_Plugins_AntiFloodPlugin(100, 30));
//Erzeugen der Sendeschleife
$status = array();
//Zählen der Emailempfänger für den Fortschrittsbalken
$status['whole'] = mysql_num_rows($sql_data_query);
set_time_limit(0);
while ($newsletter_send = mysql_fetch_array($sql_data_query, MYSQL_ASSOC)) {
$status['status']++;
$count_mails = $count_mails+1;
//Productarray übergeben aus addproducts-Funktion
$template = makesmarty($voucher, $newsletter_send, $rmlink, $_SESSION['newsletter'], $module_content, $_SESSION['language']);
if (validate_email($newsletter_send['customers_email_address']) == true) {
if ($config['8']) {
$email = $config['0'];
} else {
$email = $newsletter_send['customers_email_address'];
}
//Create the message
$message = Swift_Message::newInstance()
->setSubject($_SESSION['newsletter']['subject'], $config['7'])
//Set the From address with an associative array
->setFrom(array($config['0'] => $config['1']))
//Set the To addresses with an associative array
->setTo(array($email => $newsletter_send['customers_lastname'] . ' ' . $newsletter_send['customers_firstname']))
//And optionally an alternative body
->setBody($template['html_mail'], 'text/html', $config['7'])
//Give it a body
->addPart($template['txt_mail'], 'text/plain', $config['7'])
;
if ($_SESSION['newsletter']['attachment'] != '') {
for ($a = 0; $a < count($_SESSION['newsletter']['attachment']); $a++) {
$message->attach(Swift_Attachment::fromPath(DIR_FS_CATALOG.'upload/'.$_SESSION['newsletter']['attachment'][$a]));
}
}
$result = $mailer->send($message);
if($result != 1) {
$count_mails = $count_mails-1;
}
} else {
$email_sql = mysql_query(" update newsletter_recipients
set mail_status = '0'
where costumers_email_address = '".$newsletter_send['customers_email_address']."'
");
}
//verarbeitete Email aus der temporären Tabelle löschen
mysql_query(" delete from EG_newsletter_".$_SESSION['newsletter']['id']."
where customers_email_address = '".$newsletter_send['customers_email_address']."'
");
//Speichere den aktuellen Status in der Datenbank
mysql_query("update EG_newsletter set status = '".serialize($status)."' where id = '".$_SESSION['newsletter']['id']."' ");
$i++;
}
In der einen Gruppe sind 6500 Empfänger, in der anderen Gruppe sind 50.
Wenn ich die Gruppe mit 50 auswähle, dann bekomme ich 50 Emails aber wenn ich die 6500 Gruppe auswähle bekomme ich ca 10.000 Emails.
Die Funktionsweise ist so, dass wenn ein Newsletter gesendet wird, die Tabelle mit den Empfängern kopiert wird und die Abfrage der Empfänger aus der kopierten Tabelle gemacht wird.
Bei jedem durchlauf wird dann die gerade behandelte Emailadresse aus der temporären Tabelle gelöscht, so das eigentlich keine Emails doppelt rausgehen dürften.
Ich lasse den Versand allerdings mit einem Cronjob aufrufen, jede Stunde. Damit auch abgebrochene Newsletter versendet werden.
Die Scriptlaufzeit habe ich abgeschaltet, so dass das Script zumindest nicht durch eine Laufzeitbeschränkung abgebrochen wird.
Ist es möglich, dass sich die Cronjobs addieren? Also das wenn der eine noch läuft und das Script wird von einem neuen aufgerufen, dass es dann zu duplikaten kommen kann, weil sie gerade an der selben Stelle sind?
Vielen Dank für Eure Hinweise.
Michael
Kommentar