PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Newsletterscript -> kleine Packete senden


PhiL_phpnoob
31.05.2004, 21:34:34
Nabend,

Ich habe mir ein Newsletterscript gebaut, was auch wunderbar funktioniert.
Nur es werden immermehr Email Adressen.
Schon nach 100 Adressen bricht der IE ab beim verschicken.

Wie kann ich nun immer nur 50 Mails auf einmal versenden, dann 1min warten und danach wieder 50 Mails versenden etc.?



$sql = ("SELECT * from newsletter");
$result = mysql_query($sql) OR die(mysql_error());


while($row = mysql_fetch_assoc($result))
{

mail();

}


mail ist natürlich nicht leer, nur zum vereinfachen.


Gruß

PhiL

yozek
31.05.2004, 22:02:02
Ich würde es an deiner Stelle ein wenig anders machen und somit die Performance somit stark steigern.

Benutze einfach die BCC im Empfänger.
Damit kannst du dann eine Mail fuer 25 / 50 / 100 User raushauen ohne, dass der Server unter der Last zusammenbricht und dir einen Timeput meldet ;)

Arbeite bei der MySQL Abfrage doch folgendermassen:

Du hast ein $i welches du nach jedem gelesenen Datensatz um 1 erhöhst.

die emailadresse speicherst du in einem string
wenn $i gleich der Zahl der BCCs ist, dann schickst du eine Mail raus, resetest den string wieder auf leer und $i auf Null!

HTH

PS: SOlltest du ein genaueres Beispiel wuenschen, dann poste es hier und ich schreibe mal dein Script ein wenig um!

Corvin
31.05.2004, 22:15:51
Ja, so geht das auf jeden Fall, so habe ich das auch mal gemacht.

PhiL_phpnoob
01.06.2004, 00:45:31
Vielen Dank für die schnelle Antwort.

Wäre super nett, wenn du mir gleich ein Beispiel nennen könntest.

Das ist eigentlich schon der ganze Quelltext:


while($row = mysql_fetch_assoc($result))
{

mail($row[email], "NAME: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1");

}

Danke für die Mühe.

Gruß

PhiL

yozek
01.06.2004, 01:10:58
Alles klar, sorry fuer die späte antwort ;)
Aber hier der quellcode:


while($row = mysql_fetch_assoc($result))
{
$bcc_array[] = $row[email];
}

# Bcc generieren
foreach ($bcc_array as $k => $v) :
$bcc .= "Bcc: $vrn";
endforeach;

mail('newsletter@domain.net', "NAME: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1" . $bcc);



Funktioniert folgendermassen:
Alle emailAdressen werden in das Array bcc:array eingelesen, nun wird ein BCC erstellt und letztendlich an die Mailheader hinzugefügt.

Somit verschickst du mit einem rutsch diese Mails. Du musst aber beachten, dass es Server gibt, die maximal 50 BCCs verwalten können. Falls das der Fall ist, solltest du 50 bccs kreieren, mail senden, und wieder 50 bccs generieren und die mail versenden. so lange bis keine empfänger mehr da sind!

dann muesste das alles wie folgt aussehen:


$alles = mysql_num_rows($result);
while($row = mysql_fetch_assoc($result))
{
$bcc_array[] = $row[email];
}

# Bcc generieren

$a=1;
foreach ($bcc_array as $k => $v) :
$bcc .= "Bcc: $vrn";

# Wenn 50 BCC Empfänger gesammelt wurden
# oder
# wenn keine BCC Empfänger mehr zu verteilen sind

if ($a == 50 or $alles == 0):

# wird die mail losgeschickt

mail('newsletter@domain.net', "NAME: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1" . $bcc);
$a = 1;
$bcc = '';
endif;
$a++;
$alles--;
endforeach;


HTH

---

yozek

PhiL_phpnoob
01.06.2004, 10:55:58
Vielen Dank. Habs natürlich gleich ausprobiert.

Eine unklarheit gibs allerdings noch:

$alles ist doch die Anzahl aller Mail Adressen die in der DB liegt.

Hier der etwas formatierte quelltext:



$sql = ("SELECT * from esepa_newsletter WHERE status='2'");
$result = mysql_query($sql) OR die(mysql_error());

$sql_count = ("SELECT COUNT(email) AS anzahl from esepa_newsletter WHERE status='2'");
$result_count = mysql_query($sql_count) OR die(mysql_error());
$row_count = mysql_fetch_assoc($result_count);




$alles = $row_count[anzahl];
//$alles = mysql_num_rows($result);
while($row = mysql_fetch_assoc($result))
{
$bcc_array[] = $row[email];
}

# Bcc generieren

$a=1;
foreach ($bcc_array as $k => $v) :
$bcc .= "Bcc: $vrn";

# Wenn 50 BCC Empfänger gesammelt wurden
# oder
# wenn keine BCC Empfänger mehr zu verteilen sind

if ($a == 50 or $alles == 0):

# wird die mail losgeschickt

if ($row[html] == 1)
{
mail('yy@yy.de', "NAME: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1" . $bcc);
}
else
{
mail('yy@yy.de', "NAME: ".$_POST[subject]."" , "".$line[headertxt]." ".$_POST[txt]." ".$line[footertxt]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1" . $bcc);
}
echo "$alles";
$a = 1;
$bcc = '';
endif;
$a++;
$alles--;
endforeach;



versenden tut er nämlich nichts :)

Gruß

PhiL

PhiL_phpnoob
01.06.2004, 11:20:49
tut mir leid, ich war zu voreilig.

Funktioniert alles bestens :)

Trotzdem möchte ich nochmal nachfragen ob
ich das mit $alles richtig verstanden habe.

2. Frage:

Er versendet also eine Mail an yy@yy.de bzw. newsletter@domain.net
in deinem Script.
Dies steht dann auch bei allen Emails bei "An" drin, oder?

Mit dieser einen Email gehen die allen anderen mit BCC raus?

Vielen Vielen Dank,

Gruß

PhiL

PhiL_phpnoob
01.06.2004, 11:34:48
ein kleiner denkfehler meinerseits ist noch drin,
den ich vergessen habe zu erwähnen.

Es soll unterschieden werden, user die den Newsletter in
HTML format bekommen und user die den Newsletter in TXT Format
bekommen.

yozek
01.06.2004, 11:43:29
gib mal an den schuesselstellen ein echo zurueck...

erstmal:

echo $alles;
print_r(bcc_array);


Damit kannst du dir dann anzeigen lassen, woran es harpert ;)

yozek
01.06.2004, 11:52:59
Zu deinen ersten fragen:

1) ja alle sehen dieses yy@yy.de oder newsletter@domain.net
da der rest per bcc rausgehauen wird, sind diese nicht ersichtlich, da blind carbon copy ;)

2) das ist kein denkfehler.
mach es analog zu diesen schritten ;)

SELECT Abfrage so gestallten dass zuerst alle für HTML Mails ausgelesen werden und dann die mail verschicken

dann die Select für plaintext mails und dann wieder alle sammeln in nem array und abschicken ;)


das wars dann ;)


while($row = mysql_fetch_assoc($result))
{
if ($row[html] == 1) :
$bcc_array_html[] = $row[email];
else:
$bcc_array_plain[] = $row[email];
endif;
}


Nun musst du nur die eachfor schleifen einmal fuer bcc_array_html und bcc_array_plain machen und fertig ist es ;)

xabbuh
01.06.2004, 13:06:46
Original geschrieben von yozek
Du musst aber beachten, dass es Server gibt, die maximal 50 BCCs verwalten können.

Gibt es da eine Möglichkeit, nachzusehen, wieviele BCCs ein Server verwalten kann?

PhiL_phpnoob
01.06.2004, 13:53:44
Hi,

soweit geht alles, es kommt aber halt keine mail an.
PHP bringt keinen Fehler o.ä.

Array`s sind korrekt und $alles auch.

Nur wo liegts Problem:

Wäre nett, wenn du es nochmal durchschauen könntest.
thx


$alles = mysql_num_rows($result);


while($row = mysql_fetch_assoc($result))
{
if ($row[html] == 1)
{
$bcc_array_html[] = $row[email];
}
else
{
$bcc_array_txt[] = $row[email];
}

}


# Bcc generieren für html
$a=1;
foreach ($bcc_array_html as $k => $v)
{
$bcc .= "Bcc: $vrn";

# Wenn 50 BCC Empfänger gesammelt wurden
# oder
# wenn keine BCC Empfänger mehr zu verteilen sind

if ($a == 50 or $alles == 0)
{
# wird die mail losgeschickt
mail('newsletter@server.net', "ESEPA: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1" . $bcc);
$a = 1;
$bcc = '';
}
$a++;
$alles--;
}


# Bcc generieren für TXT
$b=1;
foreach ($bcc_array_txt as $k => $v)
{
$bcc .= "Bcc: $vrn";

# Wenn 50 BCC Empfänger gesammelt wurden
# oder
# wenn keine BCC Empfänger mehr zu verteilen sind

if ($b == 50 or $alles == 0)
{
# wird die mail losgeschickt
mail('newsletter@server.net', "ESEPA: ".$_POST[subject]."" , "".$line[headertxt]." ".$_POST[txt]." ".$line[footertxt]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1" . $bcc);
$b = 1;
$bcc = '';
}
$b++;
$alles--;
}


Gruß

PhiL

xabbuh
01.06.2004, 14:16:28
Original geschrieben von PhiL_phpnoob
mail('newsletter@server.net', "ESEPA: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1n " . $bcc);

Jürg
01.06.2004, 19:40:05
Sorry, ich finde aber das BCC generell nicht gut, in den Kopfzeilen sind immer auch alle anderen BCC enthalten, damit könnte Missbrauch getrieben werden.
Das Problem des Versandes ist auch mir bekannt. Bis jetzt habe ich Newsletter an mehrere hundert Empfänger über den Browser per php versendet. Dabei habe ich jeweils mit SELECT und Feldern "von ID" bis "bis ID" die Anzahl auf hundert Mails eingeschränkt und das ganze mehrere mals wiederholt, wobei ich dazwischen ca. 5 Min. gewartet habe. Das funktioniert gut, ist aber unschön.
Das Script selbst müsste "langsam laufen", aber wie? Hochzählen ist wahrscheinlich auch nicht das wahre, das belastet den Server nur zusätzlich. Eventuell könnte mit Timestamp gearbeitet werden?
Wer hat die zündente Idee und ein Script!

feuervogel
01.06.2004, 19:42:19
>Sorry, ich finde aber das BCC generell nicht gut, in den Kopfzeilen sind immer auch alle anderen BCC enthalten, damit könnte Missbrauch getrieben werden.

öhm, der trick an bcc ist doch, dass die anderen empfänger eben nicht gesehen werden...

Jürg
01.06.2004, 20:12:12
Eine weit verbreitete Meinung!
Wenn Du Outlook verwendest, gehe mal auf Ansicht, Optionen und schau Dir die Internetkopfzeilen an, da staunst Du!

PhiL_phpnoob
01.06.2004, 20:45:37
wenn man die mails per CC verschickt sieht man die Empfänger,
bei BCC nicht(BlindCopy).

Werd das ganze aber überprüfen.

Habs übrigens jetzt hinbekommen :)

Gruß

PhiL

PhiL_phpnoob
01.06.2004, 23:01:31
stimmt schon, im eigentlichen Mail quelltext stehen alle BCC Empfänger drin.

Ist aber unter Outlook nicht ohne weiteres Sichtbar. Man muss schon
wissen nach was man sucht.

Hab allerdings noch ein Problem:

An den, an den die eigentliche Email geschickt wird, bekommt diese auch. Nur die BCC Empfänger nicht.

Wo liegt der Fehler?



// BCC

// für die HTML Empfänger

foreach ($bcc_array_html as $k => $v) :
$html_bcc .= "Bcc: $vrn";
endforeach;

mail("".$_POST[from]."", "ESEPA: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1" . $html_bcc);

// ------------------------ //


// für die TEXT Empfänger

foreach ($bcc_array_txt as $k => $v) :
$txt_bcc .= "Bcc: $vrn";
endforeach;

mail("".$_POST[from]."", "ESEPA: ".$_POST[subject]."" , "".$line[headertxt]." ".$_POST[txt]." ".$line[footertxt]."", "From: ".$_POST[from]."" . $html_txt);



Gruß und gute Nacht,

PhiL

feuervogel
01.06.2004, 23:07:58
>$txt_bcc .= "Bcc: $vrn";

wenn du die mails auf ner linux kiste verschickst, muss das dann nicht

$txt_bcc .= "Bcc: $vn";

heißen?

PhiL_phpnoob
01.06.2004, 23:31:15
seit gerade eben hat er auf einmal
daran was auszusetzen:

Invalid argument supplied for foreach()
bei


foreach ($bcc_array_html as $k => $v) :
$html_bcc .= "Bcc: $vrn";
endforeach;


diese mail funktion bringt mich schon noch irgendwan zur Verzweiflung.

na ja, darüber schlafen hilft oft :)

g8
PhiL

PhiL_phpnoob
02.06.2004, 00:15:00
So, jetzt funktioniert aber wirklich alles.
Code:



while($row = mysql_fetch_assoc($result))
{
if ($row[html] == 1)
{
$bcc_array_html[] = $row[email];
}
else
{
$bcc_array_txt[] = $row[email];
}
}

# Bcc generieren
foreach ($bcc_array_html as $k => $v) :
$html_bcc .= "Bcc: $vrn";
endforeach;


mail("".$_POST[from]."", "ESEPA: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1;n" . $html_bcc);

$bcc_array_html_count = count($bcc_array_html);
echo "Es wurden <b>$bcc_array_html_count</b> HTML Letter gesendet<br>";

# Bcc generieren
foreach ($bcc_array_txt as $k => $v) :
$txt_bcc .= "Bcc: $vn";
endforeach;

$absender = $_POST[from];
mail("".$_POST[from]."", "ESEPA: ".$_POST[subject]."" , "".$line[headertxt]." ".$_POST[txt]." ".$line[footertxt]."", "From: ".$_POST[from]."n" . $txt_bcc);

$bcc_array_txt_count = count($bcc_array_txt);
echo "Es wurden <b>$bcc_array_txt_count</b> TXT Letter gesendet<br>";
$bcc_array_all_count = $bcc_array_txt_count + $bcc_array_html_count;
echo "Insgesamt wurden <b>$bcc_array_all_count</b> Letter gesendet<br>";


Gruß

PhiL

yozek
02.06.2004, 10:26:42
DELETED

Doppelposting!

yozek
02.06.2004, 10:29:03
Coool ;)

kommen denn auch alle Mails an?
Ich meine es kann ja sein, dass es ein wenig viele BCCs sind ;)

Lieber wäre es mir wirklich maximal mit einem mal max. 25-40 mails zu schicken pro Mail() Aufruf ;)


while($row = mysql_fetch_assoc($result))
{
if ($row[html] == 1)
{
$bcc_array_html[] = $row[email];
}
else
{
$bcc_array_txt[] = $row[email];
}
}

# Bcc generieren fuer HTML Mail und jedes mal nach 25 Empfängern abschicken

$html_gesamt = count($bcc_array_html);
$i = 0;
$html_bcc = '';
foreach ($bcc_array_html as $k => $v) :
$html_bcc .= "Bcc: $vrn";
$i++;
$html_gesamt--;
if ($i == 24 or $html_gesamt == 0):
mail("".$_POST[from]."", "ESEPA: ".$_POST[subject]."" , "".$line[header]." ".$_POST[html]." ".$line[footer]."", "From: ".$_POST[from]."nContent-Type: text/html; charset=iso-8859-1;n" . $html_bcc);
$i=0;
$html_bcc = '';
endif;
endforeach;


# Bcc generieren fuer Plain Mail und jedes mal nach 25 Empfängern abschicken

$absender = $_POST[from];
$txt_gesamt = count($bcc_array_txt);
$i = 0;
$html_bcc = '';
foreach ($bcc_array_txt as $k => $v) :
$txt_bcc .= "Bcc: $vrn";
$i++;
$txt_gesamt--;
if ($i == 24 or $txt_gesamt == 0):
mail("".$_POST[from]."", "ESEPA: ".$_POST[subject]."" , "".$line[headertxt]." ".$_POST[txt]." ".$line[footertxt]."", "From: ".$_POST[from]."n" . $txt_bcc);

$i=0;
$txt_bcc = '';
endif;
endforeach;

$bcc_array_html_count = count($bcc_array_html);
echo 'Es wurden <b>'.$bcc_array_html_count.'</b> HTML Letter gesendet<br>';

$bcc_array_all_count = $bcc_array_txt_count + $bcc_array_html_count;
echo "Insgesamt wurden <b>$bcc_array_all_count</b> Letter gesendet<br>";


Das habe ich mal eben umgeschrieben, um genau das oben genannte zu tun! Kannst das ja mal ausprobieren!

PhiL_phpnoob
02.06.2004, 12:19:39
scheint zu funktionieren. Hab`s allerdings bisher nur in einer testphase laufen, also nur mit 5 Empfängern.

Mal schaun, wie es dann später aussieht.
Die Mails kommen aber an!

Eine kleinigkeit haste vergessen:


$bcc_array_txt_count = count($bcc_array_txt);
echo 'Es wurden <b>'.$bcc_array_txt_count.'</b> TXT Letter gesendet<br>';


Somit ist der Post dann abgeschlossen, hoffe ich.

Danke an alle

Gruß

PhiL