kittlosMedlem sedan sep. 2002205 inlägg Det har snackats en del om att man i stora mailutskick bör loopa så att ca 50 skickas åt gången.
Sitter och sliter med en sådan loop, men får inte till det. Nån som har en färdig lösning, eller kan förklara hur den måste gå till?
jag har mina mailadresser i en mysql-tabell
DarrenMedlem sedan dec. 2002789 inlägg for($i = 1; $i <= 50; $i++){
// ta fram dina adresser här och skicka de...
}
eller
while ($i < 50){
// ta fram dina adresser här och skicka de...
$i++;
}
Hoppas att det var detta du menade...
kittlosMedlem sedan sep. 2002205 inlägg jo, men sen ska den ju göra om loopen med nästföljande 50 poster osv, tills den gått igenom alla poster. Dessutom ska 50-loopen avbrytas om posterna tar slut. Mycket att hålla rätt på alltså.
Har pillat med en dubbel loop, men får inte riktigt till det...
DarrenMedlem sedan dec. 2002789 inlägg
kittlos skrev:
jo, men sen ska den ju göra om loopen med nästföljande 50 poster osv, tills den gått igenom alla poster. Dessutom ska 50-loopen avbrytas om posterna tar slut. Mycket att hålla rätt på alltså.
Har pillat med en dubbel loop, men får inte riktigt till det...
Kan man göra rekursiva anrop i php tro???
testa detta (antar att du hämtar adresserna från databasen..)
$from = 0;
$limit = 50;
function sendMail($from, $limit){
// hämta datan här med fromposten och limit
// en test här för att se om du har flera adresser att skicka till
if (blalalalal){
// ock så tar du loopet här
for ($i = 1; $i <= 50; $i++){
// skicka mailet här...
}
// när loopet är slut adderar du 50 till from variabeln och anropar samma funktion igen
$from = $from + 50;
sendMail($from, $limit)
}
}
Observera att jag inte är säker på att det fungerar :)
MatteMedlem sedan aug. 20002 975 inlägg Kanske något på det här hållet:
<?php
$sql = "SELECT email FROM tabell";
$result = mysql_query($sql);
$count = 0;
$recepient = "";
while ($row = mysql_fetch_array($result)){
$recepient .= ",".$row['email'];
$count++;
// Om 50 adresser skicka mail
if ($count == 50){
$recepient = substr($recepient, 1);
mail($recepient, "Ämne", "meddelande");
$count = 0;
$recepient = "";
}
}
// Tag hand om resten
if ($count > 0){
$recepient = substr($recepient, 1);
mail($recepient, "Ämne", "meddelande");
}
?>
Då blir det ju en vanlig "pagin" som du behöver... vilket de fina medlemmarna redan ordnat åt dig :)
kittlosMedlem sedan sep. 2002205 inlägg
$recepient = substr($recepient, 1);
Matte, din version ser bra ut och är begriplig, men varför behöver ovanstående rad se ut som den gör?
DarrenMedlem sedan dec. 2002789 inlägg
kittlos skrev:
$recepient = substr($recepient, 1);
Matte, din version ser bra ut och är begriplig, men varför behöver ovanstående rad se ut som den gör?
För att ta bort kommatecken som skrivs till $recepient första gången...
kolla koden nedanför där han lägger ihop epost adresserna...
$recepient .= ",".$row['email'];
kittlosMedlem sedan sep. 2002205 inlägg
För att ta bort kommatecken som skrivs till $recepient första gången...
kolla koden nedanför där han lägger ihop epost adresserna...
kod:--------------------------------------------------------------------------------
$recepient .= ",".$row['email'];
--------------------------------------------------------------------------------
Läggs alla adresser in på en gång med ovanstående rad?
MatteMedlem sedan aug. 20002 975 inlägg Vad koden gör är att bunta ihop 50 stycken och sedan skicka dessa 50. Nu är alla 50 inlagda som mottagare, så var och en som får mailet kommer att se 49 andra som också har fått mailet.
Koden var bara ett exempel på själva loopen. Jag är inte så hemma på själva mail-funktionen för att säga hur du ska göra för att bara en adress ska vara synlig. Kanske det går att lägga $recepient i Bcc i header. Jag vet inte, men trodde du själv hade den delen klar, och bara frågade efter hur du skulle loopa.
Att skicka mailen en och en tror jag inte är så lyckat ur timeout-synpunkt.
Jag vill minnas att det har varit uppe tidigare i detta forum om hur man skickar stora mängder mail, men vad som sades, kommer jag inte ihåg. Sök så hittar du det nog.
kittlosMedlem sedan sep. 2002205 inlägg jo, jag har mail-funktionen klar, skickar dem som bcc, så det går nog bra.
Men jag blev lite konfunderad över de rader där kolon först läggs till och sedan tas bort, varför det görs och hur?
Hade man kunnat skriva så här?:
$recepient .= $row['email'].",";
och på så sätt sluppit strippa det första kolonet i raden:
$recepient = substr($recepient, 1);
?
MatteMedlem sedan aug. 20002 975 inlägg
kittlos skrev:
jo, jag har mail-funktionen klar, skickar dem som bcc, så det går nog bra.
Men jag blev lite konfunderad över de rader där kolon först läggs till och sedan tas bort, varför det görs och hur?
Hade man kunnat skriva så här?:
$recepient .= $row['email'].",";
och på så sätt sluppit strippa det första kolonet i raden:
$recepient = substr($recepient, 1);
?
Naturligtvis, men då får du istället ta bort det sista kolonet innan du skickar.
kittlosMedlem sedan sep. 2002205 inlägg Ok, jag har bara lite problem med att förstå om alla poster tankas in i recepient med
$recepient .= $row['email'].",";
med en gång, eller i loopen, och hur räknar den i så fall upp till nästa post?
Nåja, scriptet fungerade hursomhelst toppen, nu kan jag göra mina feta mailutskick. Tusen tack!
MatteMedlem sedan aug. 20002 975 inlägg Det här är loopen:
while ($row = mysql_fetch_array($result)){
$recepient .= ",".$row['email'];
$count++;
För varje varv while-loopen går så läses en rad in från databasen och e-postadressen läggs i recepient. Antalet adresser registreras i $count som räknas upp med 1 varje varv.
När $recepient innehåller 50 adresser så skickas mailet och $recepient och $count nollställs, och loopen fortsätter.
Nästa gång $recepient innehåller 50 adresser så skickas mailet o.s.v.
När loopen har gått till slut (sista raden i databasen) så innehåller $recepient ett antal adresser. Dessa skickas slutligen också.
Matte skrev:
Kanske något på det här hållet:
<?php
$sql = "SELECT email FROM tabell";
$result = mysql_query($sql);
$count = 0;
$recepient = "";
while ($row = mysql_fetch_array($result)){
$recepient .= ",".$row['email'];
$count++;
// Om 50 adresser skicka mail
if ($count == 50){
$recepient = substr($recepient, 1);
mail($recepient, "Ämne", "meddelande");
$count = 0;
$recepient = "";
}
}
// Tag hand om resten
if ($count > 0){
$recepient = substr($recepient, 1);
mail($recepient, "Ämne", "meddelande");
}
?>
Någon som vet begränsningen med ovanstäeende script? hur många mail-adresser kan det klara av? 1000? 2000? 3000?
Har använt mig av ovanståeende lösning till min sajts nyhetsbrev.
Tacksam för svar.
MVH Peter
kittlosMedlem sedan sep. 2002205 inlägg Min sida skickar iväg 1500 mail.
DarrenMedlem sedan dec. 2002789 inlägg Skall inte finnas någon begränsning i scriptet ovan... Så länge du får data från databasen och while satsen körs så skickas ju meddelanden med mail funktionen (50 åt gången för att slippa få timeout från mailservern).
Naturligtsvis är det så att ju mer mail du skall skica destå mer tid tar det...
kittlosMedlem sedan sep. 2002205 inlägg Jag har försökt göra så att sidan skriver ut ett meddelande efter varje loop, så att man har koll på hur långt man kommit. Den fungerar dock sådär, buntar ihop 10-15 loopar och skriver ut dem. Antar att det har med servern att göra och inte är något man kan påverka.
DarrenMedlem sedan dec. 2002789 inlägg Har inte testat men detta borde fungera någorlunda... :e
<?php
$sql = "SELECT email, COUNT(email) AS antal FROM tabell";
$result = mysql_query($sql);
$count = 0;
$recepient = "";
while ($row = mysql_fetch_array($result)){
$recepient .= ",".$row['email'];
$count++;
// Om 50 adresser skicka mail
if ($count == 50){
$recepient = substr($recepient, 1);
mail($recepient, "Ämne", "meddelande");
$count = 0;
$recepient = "";
$index++;
$percent = ((50 * $index) / $row['antal']) * 100;
echo $percent.'%<br>';
}
}
// Tag hand om resten
if ($count > 0){
$recepient = substr($recepient, 1);
mail($recepient, "Ämne", "meddelande");
echo '100%<br>';
}
else{
echo '100%<br>';
}
?>
MatteMedlem sedan aug. 20002 975 inlägg