/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Nyhedsbrev 's funktion?
Fra : Dude


Dato : 04-03-08 14:12

Hej alle!

Jeg lavede for længe siden en lille funktion som sendte nyhedsbrev ud
til alle email adresser, som havde tilmeldt sig (via MySQL).
Det var bare en løkke, som hentede adresserne ud fra databasen, og
sendte brevet efterhånden som adresserne blev hentet.

Men nu er der ved at være ca 2000 adresser i databasen - og det er
efterhånden ved at være en langsommelig affære at sende nyhedsbrevet.
Udover at jeg skal vente længe på at løkken er færdig, så hænder det at
der er timeout - så ikke alle modtager nyhedsbrevet.

Jeg må finde en ny metode at sende nyhedsbrev.

Gode råd?

Iøvrigt: Jeg sender html-mail.

Mvh
John

 
 
Bertel Lund Hansen (04-03-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 04-03-08 15:07

Dude skrev:

> Men nu er der ved at være ca 2000 adresser i databasen - og det er
> efterhånden ved at være en langsommelig affære at sende nyhedsbrevet.
> Udover at jeg skal vente længe på at løkken er færdig, så hænder det at
> der er timeout - så ikke alle modtager nyhedsbrevet.

Det kunne fikses med en ny indgang i databasen der skulle mærke
af om nyhedsbrevet var blevet sendt til adressen. På den måde
kunne du genstarte processen uden at folk fik to eller flere
eksemplarer.

Det tidsmæssige aspekt har jeg ikke nogen løsning på.

Jeg kunne finde på at lave massemail med mit mailprogram. F.eks.
kan jeg sende en mail til "Familien" og så får alle i den
mailgruppe mailen. Det tager ikke længere tid end en normal mail
(jeg har prøvet med flere hundrede modtagere).

Desværre har det den ulempe på mit system/program/opkobling at
hver mailadresse tjekkes, og hvis én fejler, går afsendelsen i
stå. Det kan tage tid at spore problemet, og man skal så lave en
tempgruppe for ikke at nogen får to mails.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Johan Holst Nielsen (04-03-2008)
Kommentar
Fra : Johan Holst Nielsen


Dato : 04-03-08 15:35

Dude wrote:
> Hej alle!
>
> Jeg lavede for længe siden en lille funktion som sendte nyhedsbrev ud
> til alle email adresser, som havde tilmeldt sig (via MySQL).
> Det var bare en løkke, som hentede adresserne ud fra databasen, og
> sendte brevet efterhånden som adresserne blev hentet.
>
> Men nu er der ved at være ca 2000 adresser i databasen - og det er
> efterhånden ved at være en langsommelig affære at sende nyhedsbrevet.
> Udover at jeg skal vente længe på at løkken er færdig, så hænder det at
> der er timeout - så ikke alle modtager nyhedsbrevet.
>
> Jeg må finde en ny metode at sende nyhedsbrev.

Umiddeltbart er der 2 metoder - begge er faktisk delvis beskrevet af Betel.

A. Brug af BCC header. Jeg formoder - ud fra din beskrivelse - at du
sender hver enkelt e-mail via en almindelig e-mail. Altså 2000 modtagere
= 2000 e-mails. I stedet kan du bruge BCC header - og måske tilføje
50-100 e-mail adresser i hver e-mail. Dog vil brugeren egen
e-mail-adresse ikke figurere som modtager adresse.

B. Brug en switch i databasen. F.eks. tilføj et e-mail "is_sent" switch
i databasen og lavet scriptet noget ala

<?php
if(empty($_GET['continue'])) {
$sql = "UPDATE emailtabel SET is_sent = 0";
mysql_query($sql);
}

$limit = 100;

$sql = "SELECT email FROM emailtabel WHERE is_sent = 0 LIMIT ".$limit;
$res = mysql_query($sql);
$doCont = false;
if(mysql_num_rows($res)>=$limit) {
$doCont = true;
}
while($r = mysql_fetch_assoc($res)) {
//send e-mail :)
}

if($doCont) {
header("Location: ./emailSenderScript.php?continue=yes");
}
?>

Kort sagt første gang scriptet køres settes is_sent til 0. Der hentes
100 e-mails af gangen. Så reloades scriptet for hver 100 mail til den er
færdig.

--
Johan Holst Nielsen
Freelance PHP Developer - http://phpgeek.dk

Martin (04-03-2008)
Kommentar
Fra : Martin


Dato : 04-03-08 22:26

Dude wrote:
> Hej alle!
>
> Jeg lavede for længe siden en lille funktion som sendte nyhedsbrev ud
> til alle email adresser, som havde tilmeldt sig (via MySQL).
> Det var bare en løkke, som hentede adresserne ud fra databasen, og
> sendte brevet efterhånden som adresserne blev hentet.
>
> Men nu er der ved at være ca 2000 adresser i databasen - og det er
> efterhånden ved at være en langsommelig affære at sende nyhedsbrevet.
> Udover at jeg skal vente længe på at løkken er færdig, så hænder det at
> der er timeout - så ikke alle modtager nyhedsbrevet.
>
> Jeg må finde en ny metode at sende nyhedsbrev.
>
> Gode råd?
>
> Iøvrigt: Jeg sender html-mail.
>
> Mvh
> John

Hvis tiden ikke er så væsentlig, men mere at alle får mailen, og du ikke
får nogle timeouts - så ville jeg lave det via AJAX

Noget ala

<html>
<script type="text/javascript">
function sendmail(numbers) {
if(numbers==='undefined') numbers = 0;
$.post('sendmail.php',{
data: {start: numbers},
success: function(ret) {
if(ret) {
$('#emails').html('Har nu sendt: <b>' + numbers + '</b> emails
ud');
sendmail(ret);
} else {
$('#emails').html('Nu er jeg færdig med at sende mails ud!');
}
}
});
}

<body onload="sendmail()">
<div id="emails"></div>
</body>
</html>

sendmail.php kunne se således ud
<?php
// $_POST['start'] kommer fra javascriptet
$mailsprrequest = 20;

function getTotal() {
// SQL der henter total antal emails ud
return $total;
}

function getEmails($start,$count) {
// SQL der henter fra start og til count
// Altså SQL'en skal have følgende
// LIMIT $start, $start+$count
return $emails;
}

if($emails = getEmails($_POST['start'], $mailsprrequest)) {
foreach($emails AS $email) {
mail($email,'Emne','Besked');
}
}

if(getTotal > $_POST['start']) {
echo $mailsprrequest+$_POST['start'];
}

Så skal man bare kalde html filen, uden noget som helst (fx. i et popup
vindue?)

Martin (04-03-2008)
Kommentar
Fra : Martin


Dato : 04-03-08 22:28

Martin wrote:
> $('#emails').html('Har nu sendt: <b>' + numbers + '</b> emails

+ numbers + skal lige rettes til + ret +


PS
Så er det ikke testet overhovedet, men det var lige en åbenlys fejl :)

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste