newsletter mit mail() im hintergrund versenden lassen?

Wenn die E-Mails nicht personenbezogen sind, müsstest du eigentlich nur einen E-Mail-Verteiler finden, der zwar an alle Adressen des „BCC“-Header-Felds sendet, diesen aber in den einzelnen E-Mails entfernt. Dann würde prinzipiell nämlich nur eine E-Mail ausreichen.
 
Nun, das Script weiss ja durch abfragen des Zählers ab welchen Empfänger der nächste "Schub" an Mails verschickt werden soll.
Der Zähler muss ja nicht unbedingt täglich auf Null gesetzt werden..... wenn Du z.b. nur einmal pro Woche inen Newsletter verschicken willst, langt es auch wenn der Zähler an einem bestimmten Wochentag zurück gesetzt wird.
Du musst halt nur immer darauf achten dass der Beginn des Versands so rechtzeitig beginnt, dass er fertig ist bevor der Zähler zurückgesetzt wird.
 
@Gumbo: Die emails sind personenbezogen, mit bcc kann ich leider nicht arbeiten.

@Dr Dau: Du hast Recht.. der Zähler macht das ja bereits...
Okay, also so irgendwie werde ich das dann wohl machen müssen. Der Cronjob wird automatisch jede Stunde ausgeführt und verschickt einfach den Newsletter an alle Email Adressen in der Datenbank. Sobald alle Emails verschickt sind, wird der Newsletter in der Datenbank als abgeschlossen markiert, und das Script hinter dem Cronjob fängt erst wieder an neue Mails zu versenden, wenn es einen neueren Newsletter gibt.
Wenn ich nicht mehr weiterkomme, melde ich mich wieder... :)
 
So.. hier mal mein Skript, welches über Cronjobs jede halbe Std aufgerufen wird.
'newsletter_limit' habe ich in meiner Datenbank auf 250 stehen. 500 Mails also pro Stunde. Läuft super und mein Provider macht das locker mit :)

Bis denn,
Marc

PHP:
<? 
include("../config.php");
require_once('Mail.php');
require_once('Mail/mime.php');

global $CFG, $ME;

/* die Anzahl der zu versendenen Mails holen */
$settings = db_fetch_object(db_query("
	SELECT newsletter_limit
	FROM settings
"));

/* Hole newsletter-ID und Mail Content aus DB */
$a = db_query("
	SELECT id, html
	FROM newsletter
	WHERE pls_send = '1'
	AND finished != '1'
");

if (db_num_rows($a) != 0) { 
	
	$newsletter = db_fetch_object($a);

	/* Hole XXX Email Adressen aus der Empfängerdatenbank, die noch keine Mail erhalten haben */
	$qid = db_query("
		SELECT email
		FROM newsletter_recipients
		WHERE email_received = '0'
		LIMIT 0,$settings->newsletter_limit
		");

	/* Newsletter versenden */
	while ($recipients = db_fetch_object($qid)) {
    $message = new Mail_mime();
    $text = "";
    $html = $newsletter->html;

    $message->setTXTBody($text);
    $message->setHTMLBody($html);
    $body = $message->get();
    $extraheaders = array("From"=>"xxxx", "Subject"=>"Newsletter");
    $headers = $message->headers($extraheaders);

    $mail = Mail::factory("mail");
    $mail->send($recipients->email, $headers, $body);
    
    /* Nach dem Versenden wird die email in der Datenbank gekennzeichnet */
    db_query("
			UPDATE newsletter_recipients SET
				email_received = '1'
			WHERE email = '$recipients->email'
		");
	}

	/* Prüfen ob alle Emails verschickt wurden. Wenn ja, dann den Newsletter als abgeschlossen markieren, und alle Emails wieder zurücksetzen */
	$qid = db_query("
		SELECT 1 
		FROM newsletter_recipients
		WHERE email_received = '0'
	");

	if (db_num_rows($qid) == '0') {
		db_query("															
			UPDATE newsletter SET
				 finished = '1'
				,pls_send = '0'
			WHERE id = '$newsletter->id'
		");
		
		db_query("
			UPDATE newsletter_recipients SET
				email_received = '0'
			WHERE 1
		");
	}
} else {
	echo "nothing to do";
}
?>
 
Zurück