Versenden von über 200 E-Mail via PHP's sendmail

Johnnii360

Erfahrenes Mitglied
Versenden von über 200 E-Mail via PHP's mail() Befehl

Hallo,

ich habe ein grosses Problem. Meine Community umfasst im Moment ca. 300 Mitglieder. Ich habe jedes mal Probleme HTML-Newsletter an meine Mitglieder mit dem mail(); Befehl zu versenden.
Leider ist es mit diesem Befehl nur möglich, eine bestimmte Anzahl von Mails gleichzeitig zu versenden.

Hätte jemand eine Idee wie ich meinen gesammten Mailstamm in Blöcke aufgeteile und dann mit dem mail(); Befehl versenden kann? Zu beachten ist das die E-Mail-Adressen nicht im Header angezeigt werden dürfen und die Mailart eine HTML- und keine Textmail ist!

Es wir für die E-Mail-Adressen eine MySQL-Datenbank verwendet.
Ich würde mich über jede Hilfe freuen.

Vielen Dank im Voraus! :)
 
Zuletzt bearbeitet:
also da ich nicht rauslesen kann ob du BCC benutzt, hier eine mögliche lösung (bin mir aber nicht sicher ob es für BCC eine obere grenze gibt, glaube aber nicht)

$header = "FROM: blablub@dingsda.de";
$header .= "BCC: ";
foreach($mysql_results["emails"] as $email){
$header .= $email;
}
email($to,$subj,$msg,$header);

BCC = Blind Carbon Copy, müsste jedem bekannt sein, zeigt fremde emails nicht im header an und man versendet die mail nur 1x und wird danach an alle BCC's kopiert und weitergeleitet. Wenn BCC ne obere grenze haben sollte, splittest du dein array in x Teile und machst dann halt noch ne schleife, sodass BCC klappt
 
Man sollte sich beim Versenden von Informationen im Header allerdings nach den RFC's für Emails richten (maßgeblich ist 822). D.h. es muss der Zeilenumbruch beachtet werden (beispielsweise durch "\r\n") und die Emails-Adressen sollten RFC-konform formatiert sein. Dann sollte es keine Probleme geben.
 
Original geschrieben von methodus
also da ich nicht rauslesen kann ob du BCC benutzt, hier eine mögliche lösung (bin mir aber nicht sicher ob es für BCC eine obere grenze gibt, glaube aber nicht)

$header = "FROM: blablub@dingsda.de";
$header .= "BCC: ";
foreach($mysql_results["emails"] as $email){
$header .= $email;
}
email($to,$subj,$msg,$header);

BCC = Blind Carbon Copy, müsste jedem bekannt sein, zeigt fremde emails nicht im header an und man versendet die mail nur 1x und wird danach an alle BCC's kopiert und weitergeleitet. Wenn BCC ne obere grenze haben sollte, splittest du dein array in x Teile und machst dann halt noch ne schleife, sodass BCC klappt
Die Methode hört sich prima an nur wäre es nett wenn Du mir noch den mysql_query Tabellenabfragestring sagen würdest um die Datensätze auszulesen.
Wäre auch nett wenn Du mir das mit den aufteilen zeigen würdest!
Danke! :)
 
Ich hatte mal das gleiche Problem.
Alle auf einmal ging nicht, wie du schon sagtest. Dann hab ich es mit ner Schleife versucht, dass ging aber auch nicht, da kam immer nur die Hälfte an.

Du kannst es aber so machen, dass nach jeweils 10 Mails, immer ne Kurze Pause eingelegt wird von einer Sekunde oder so, und es dann erst weiter geht.
Bis denne
bf
 
300 Emails sind kein Problem

ich hab vor kurzem nen Newsletter programmiert und dabei auch mal nen Testlauf mit 1000 Mails gemacht...hintereinander..mit sendmail ...ohne bcc etc. (ist alles! angekommen...hat nur ne halbe stunde gedauert bis die letzte da war)

Da es aber wesentlich angenehmer für den Anwender ist weils net so lange dauert versend ich die Mails jetzt in 300er Blöcken...

sobald alles gesendet wurde einfach auf weiter klicken um die nächste Gruppe zu versenden...
___
allerdings weiß ich nicht ob das jeder Server zulässt..so viele sendmails hintereinander..aber ausprobiern würd ichs
 
Hier wäre es durchaus sinnvoll alle 25 Sekunden das Script neu zu starten und dabei den letzten Autowert der DB an die URL anzuhängen.
Anhand dieses Wertes kann man genau an dieser Stelle beim nächsten Aufruf des Scripts weitermachen.

Ich stand vor einiger Zeit vor dem gleichen Problem und habe es mit folgendem Script gelöst (such dir am besten das raus was du brauchst):

Installation:
Code:
<?
#
# install.php
#
//Datenbankverbindung
$db = @mysql_connect($dbserver, $dbuser, $dbpasswd);
if($db)
{
	$conn = @mysql_select_db($dbname, $db);
}
else
{
	echo "MySQL-Server ist irgendwie nicht da :p";
	die;
}

//Tabellenstruktur darf natürlich nur einmal ausgeführt werden :D
if($daten = mysql_query("CREATE TABLE IF NOT EXISTS $table(id INT(5) NOT NULL DEFAULT '0001' AUTO_INCREMENT, name VARCHAR(100), email VARCHAR(100), PRIMARY KEY (id) )"))
{
	echo "alles klar die Tabelle ist schon mal angelegt.";
}
else
{
	echo "huch Tabelle konnte nicht angelegt werden!";
}
?>

Und hier das Sendenscript ansich

Code:
<?
#
#Scriptname = newsletter_senden.php
#
$script = "newsletter_senden.php";

//Startzeit des Scripts
$start = time();

//Datenbankverbindung
$db = @mysql_connect($dbserver, $dbuser, $dbpasswd);
if($db)
{
	$conn = @mysql_select_db($dbname, $db);
}
else
{
	echo "MySQL-Server ist irgendwie nicht da :p";
	die;
}

//Was soll gesendet werden?
$subject = "Hier kommt der Betreff der Mehl rein";
$message = "Hier solte bissel Inforkrams stehen";

//checke ob id über die URL kam
if($_GET['s'] != "")
{
	$id = $_GET['s'];
}
//wenn nicht dann ist es der erste Durchlauf
else
{
	$id = 0;
}

//Emailaddys auslesen
$daten = mysql_query("SELECT id, name, email FROM newsletter WHERE id > '".$id."' ORDER BY id ASC",$db);
while($dat = mysql_fetch_array($daten))
{
	//Email senden
	mail($dat[email], $subject, $message,
	"To: ".$dat[name]." <".$dat[email].">\n" .
	"From: DerNameDeinerWebSeite <info@deinewebseite.xyz>\n" .
	"X-Mailer: PHP 4.x");
	if(time() > $start + 25)
	{
		header("location:".$script."?s=$dat[id]");   
	}
}
?>

cya bloddy

ps.:
wenn header nicht funzt, kannste es auch mit js oder location("header blublub"); machen.
 
nochmal: ihr zerbombt euch euren server, sobald ihr mehrere hundert oder 1000 emails zu versenden habt, bei 100 - 300 mags ja noch gehen aber bei 1000 bis 3000 hörts auf. daher nehmt BCC, der smtp-server macht automatisch ne kopie, aber ihr braucht bei weitem nicht die serverlast wie wenn ihr 1000 mails einzeln verschickt!!!

außerdem der unterschied ob ich nun 1000 mails einzeln schicke oder 300 mit einmal und die 1000 durch 4 oder so teile ist extrem erheblich! test it!
PHP:
<?php

// hier kommt der ganze MySQL-Kram hin mit mysql_connect usw.

$query = "SELECT email FROM users"; // anpassen!
$result = mysql_query($query);

$mysql_results = mysql_fetch_array($result); // fetch_array und fetch_object sind bedeutend schneller als mysql_result()

$splitted_array = array_chunk($mysql_results,100,true); // die 100 steht für die Emails die auf einmal gesendet werden sollen


$header = "BCC: "; 

for($i=0;$i<=count($splitted_array;$i++){
  foreach($splitted_array[$i] as $email){
    $header .= $email ." ";
  }
}

mail($to,$subj,$msg,$header);
?>

alles ungetestet, daher keine funktionsgarantie
 
das reicht dann aber nur für nen 0815 Newsletter

persönliche Begrüßung..Benutzerdaten in der Mail etc wird dann schwer, sogar unmöglich.

Die wohl beste möglichkeit wärs ne Mailsoftware auf dem Server zu installieren...aber es hat ja nicht jeder nen eigenen Server..
 

Neue Beiträge

Zurück