Mail-Funktion an mehrere Empfänger - welche Variante

qsrs

Erfahrenes Mitglied
Hallo,

habe ein Skript geschrieben, indem es Benutzer und Benutzergruppen gibt. Benutzerdaten, u. a. auch E-Mail-Adressen, sind in einer DB gespeichert. Eine der Skript-Funktionen soll eine Nachricht (evtl. mit Attachement) an alle User bzw. an Gruppen schicken.

Jetzt stelle ich mir die Frage wie ich das am Besten umsetzte, ohne zu großen Traffic zu verursachen. Wenn ich alle E-Mail-Adressen aus der DB auslese und es mit einer Schleife realisiere, zudem vielleicht noch eine Datei anhänge und die Funktion bei 50 E-Mail-Adressen auch 50 mal aufgerufen wird, dauert es viel Zu lange, bis die Anfrage abgearbeitet wird.

Gibt es eine Möglichkeit, sowie bei einem softwarebasierendem E-Mail-Client eine E-Mail zu versenden, so dass der Server das Verteilen übernimmt? Dann muss ich aber wahrscheinlich ein Konto verwenden, das auf dem Server existiert. Das möchte bzw. kann ich aber nicht.

Gibt es Alternativen? Wie macht ihr das?
 
Danke für den Link. Versuche es gerade umzusetzen. Laut dem Beispiel werden die E-Mail -Adressen ja manuell im Skript in das Array geschrieben. Wie kann ich es umsetzen, dass die Werte aus der DB in ein Array geschrieben werden, und im Anschluss in die Mail-Funktion integriert werden. Hier mein Code soweit:
PHP:
if (!empty ($user_group)) {
if ($user_group == "all_groups") {
$sql3 = "SELECT * FROM `$dbtable3` LIMIT 0, 30";
$query3 = mysql_query ($sql3, $dbconnect);
$empfaenger = mysql_fetch_array ($query3);
foreach ($empfaenger as $k => $v) {
$bcc .= "Bcc: $v\r\n";
}
mail ("test@server.de", "Testmail", "Dies ist nur eine Testnachricht.", $bcc);
}
}
 
Ok, letzter Versuch bevor der Thread untergeht.

Wie schreibe ich mehrere E-Mail-Adressen aus einer DB in ein Array und übergebe Sie mit einer For-Schleife in der Mail-Funktion an Bcc?

Um den Traffic niedrig zu halten, sollte man das über Bcc abwickeln. Dazu ist es doch erforderlich, dass mindestens ein Adressat direkt unter "An" angegeben wird, ist das richtig? Also mittels einer For-Schleife nur an Bcc zu senden ist, um Traffic zu sparen, nicht machbar? Wie setzt man es um, dass eine der E-Mail Adressen unter "An", die restlichen unter "Bcc" verwendet werden. Oder sollte man unter "An" eine Dummy-Adresse verwenden und alle gültigen per For-Schleife unter "Bcc" angeben?

Hintergrund ist einfach der, dass ich eine Massenmail (evtl. mit Anhang) effizient und ohne zu großen Traffic und Skript-Laufzeit verschicken möchte. Die Adressen hole ich dabei aus einer DB. Laut meinem Beispiel (etwas weiter oben) funktioniert das aber nicht ganz.

Danke für Antworten.
 
Ich bin jetzt ein Stück weiter gekommen. Ich verwende folgendes Skript:
PHP:
if (!empty ($user_group)) {
if ($user_group == "all_groups") {
$sql3 = "SELECT * FROM `$dbtable3` LIMIT 0, 30";
$query3 = mysql_query ($sql3, $dbconnect);
for ($i1 = 0; $i1 < mysql_num_rows ($query3); $i1++) {
$array3[$i1] = mysql_fetch_array ($query3);
}
for ($i1 = 0; $i1 < count ($array3); $i1++) {
$bcc .= "Bcc: ".$array3[$i1][user_email]."\r\n";
}
mail (test@server.de, "Testmail", "Dies ist nur eine Testnachricht.", $bcc);
}
}
Allerdings kommt immer nur eine E-Mail an, obwohl, wenn ich es mit echo kontrolliere, zwei E-Mail Adressen ausgegeben werden. Das Format sieht bei der Ausgabe so aus:

Bcc: E-Mail1@server.de Bcc: E-Mail2@server.de

Was mache ich falsch?
 
hmm, ích hab jetzt so schnell auch nichts gefunden, aber der Fehler scheint doch in der for-schleife zu liegen?

Ich würde erstmal aus

PHP:
 for ($i1 = 0; $i1 < count ($array3); $i1++) {

PHP:
 $limit = count($array3); 
for ($i1 = 0; $i1 < $limit; $i1++) {

machen.

Vielleicht kommt PHP mit der Schleife ja nich klar...

lG, Lukaro


EDIT:

Mach doch lieber eine foreach-Schleife anstatt der for-Schleife.

In dem obigen Beispiel auf der Seite ist das doch ganz einfach gemacht:

PHP:
# Empfaengerliste
  $empfaenger = array("a@example.com", "b@example.com");

  # Bcc generieren
  foreach ($empfaenger as $k => $v) {
	$bcc .= "Bcc: $v\r\n";
  }

  mail("em@pfaeng.er",
	 "Testmail",
	 "Dies ist nur eine Testnachricht.",
	 $bcc);

Du musst jetzt nur noch den Array, den du aus der DB ausgelesen hast $empfaenger nennen, und schon funktioniert alles wunderbar ;)
 
Zuletzt bearbeitet:
Vielen Dank für deine Antwort. Habe es jetzt mit foreach versucht. Ich bin mir nicht ganz sicher, ob ich die DB-Werte richtig im Array verarbeite:
PHP:
if (!empty ($user_group)) {
if ($user_group == "all_groups") {
$sql3 = "SELECT * FROM `$dbtable3` LIMIT 0, 30";
$query3 = mysql_query ($sql3, $dbconnect);
$empfaenger = mysql_fetch_array ($query3);
foreach ($empfaenger as $k => $v) {
$bcc .= "Bcc: $v\r\n";
}
mail ("email@server.de", "Testmail", "Dies ist nur eine Testnachricht.", $bcc);
}
}
Wenn ich es so mache, dann wird an alles in der Tabelle $dbtable3 eine E-Mail geschickt, also auch an Werte, die gar keine E-Mail-Adresse darstellen. Wenn ich es statt mit SELECT * FROM `$dbtable3` LIMIT 0, 30"; mit SELECT `user_email` FROM `$dbtable3` LIMIT 0, 30"; auf die Spalte der E-Mail-Adressen einschränke, wird die E-Mail nur an eine, und zwar an die erste Email-Adresse in der Tabelle geschickt.

Mache ich da nur etwas mit dem Array falsch? Kann ich es so in foreach verwenden:

PHP:
 $sql3 = "SELECT * FROM `$dbtable3` LIMIT 0, 30"; 
$query3 = mysql_query ($sql3, $dbconnect);
$empfaenger = mysql_fetch_array ($query3);
 
Das sieht doch schonmal ganz gut aus, du musst natürlich die SELECT `user_email` FROM `$dbtable3` LIMIT 0, 30"; Abfrage nehmen, da ja nur die Email in dem Array sein darf.

Bei der foreach-Schleife würde ich statt
PHP:
foreach ($empfaenger as $k => $v) {
$bcc .= "Bcc: $v\r\n";
}
mal
PHP:
foreach ($empfaenger as $v) {
$bcc .= "Bcc: $v\r\n";
}
versuchen.

Der String $bcc sieht nach zwei Durchläufen allerdings so aus: "Bcc: email1\r\n Bcc: email2\r\n"

Möglicherweise wird dann das letzte BCC immer die Vorherigen ersetzen, da der Befehl BCC immer neu definiert wird...
Hab ich aber nicht so die Ahnung von, du kannst ja mal folgendes versuchen:

Statt
PHP:
foreach ($empfaenger as $k => $v) {
$bcc .= "Bcc: $v\r\n";
}
mail ("email@server.de", "Testmail", "Dies ist nur eine Testnachricht.", $bcc);
}
einfach
PHP:
$1st = 1;
foreach ($empfaenger as $v) {
if ($1st == 1) {
$1st = 0; 
$bcc = "$v";
} else {
$bcc .= ", ".$v;
}
mail ("email@server.de", "Testmail", "Dies ist nur eine Testnachricht.", "Bcc: ".$bcc."\r\n");
}

Ich hoffe ich konnte dir wieder irgendwie helfen...
Lukaro
 
Zurück