Archief - PHP: mass attachment email syst

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

NaaiT

Legacy Member
Hi,

voor onze jeugdbeweging wil ik een mass emailsysteem maken, voor efficiënt reclame te maken voor onze activiteiten. (nu doet 1 persoon dit in 10x naar 900 man, waardoor zn pc helemaal blokkeert :p)

Nu zou ik bij die mails attachments moeten kunnen plaatsen. Ik weet ongeveer hoe dat gaat, maar ik weet niet zeker wat het snelste gaat. Ik veronderstel dat ik best de attachments eerst upload, om dan in een loopje 900x de mail()-functie te doorlopen?

Verder zou ik ook willen weten hoe het zit met foutafhandeling. Kan de mailfunctie door bepaalde omstandigheden fouten geven bij bepaalde users? Zoja, welke allemaal & hoe geef ik die weer? Ik zou gewoon zoveel mogelijk zekerheid willen inbouwen, dat de mail wel effectief naar iedereen verzonden is.

mvg

Sven

Dece

Legacy Member
phpmailer gebruiken. Deze class heeft de mogelijkheid om attachments mee te verzenden, bcc, cc, de gansen battaclan :)

en als je zeker wilt zijn dat alle mails weldegelijk naar iedereen verzonden is, dan werk je het best met een loop en hou je de emails die niet verzonden geweest bij in een array, welke je na afloop kan tonen, inclusief met de foutmeldingen!

klein vb
PHP:
require('path/naar/phpmailer/');
$mail = new phpMailer();

$errors = array();

///basic configuratie 
$mail->From = 'emailadres';
$mail->Fromname = 'Mij';
$mail->Subject = 'onderwerp';

$mail->AddAttachment('link_naar_bestand');

while($email = mysql_fetch_assoc($query_result))
{
    $mail->AddAdress($email['adres']);

    if (!mail->Send())
    {
         $error[$email['adres']] = $mail->ErrorInfo;
    }
}//einde while

//controleren of we error's gehad hebben
if (!empty($error))
{
     echo 'volgende personen faalden: <br />';

     foreach($error as $emailadres => $fout)
     {
          echo $emailadres . '. Opgegeven reden is: ' . $fout;
      }
}
else
{
    echo 'succes';
}

vergeef me een eventuele fout! niet uitgetest ;)

RpR

Legacy Member
Onze mailserver crasht altijd op meer als 1000 email simultaan (Gepersonaliseerde e-mails).

Evil_Homer

Legacy Member
RpR zei:
Onze mailserver crasht altijd op meer als 1000 email simultaan (Gepersonaliseerde e-mails).
crashen? waarschijnlijk killen omdat hij denkt dat het spam is.

Dece

Legacy Member
wa ge ook kunt doen, in zo een geval is bv 10 email adressen toevoegen aan de AddAdress() en dan pas eentje versturen.
Dan hebde "maar" 10 adressen da ge handmatig moet gaan contacteren :)

NaaiT

Legacy Member
mja no offence, maar voor ik een mailsysteem met alles erop & eraan ga proberen, wil ik dit eerst zelf in elkaar proberen te knutselen :) Het zal belange niet hetgene kunnen dat phpmailer kan, maar het zal wel kunnen wat ik nodig acht. Het is voor mij de bedoeling om er zelf wat van op te steken, en om niet zomaar een scriptje te downloaden.
Aangezien dit voor een jeugdbeweging is waar ik in zit, & niet voor een of andere klant die mij betaald, vind ik dit de perfecte manier om zelf dingen te experimenteren.

NaaiT

Legacy Member
RpR zei:
Onze mailserver crasht altijd op meer als 1000 email simultaan (Gepersonaliseerde e-mails).
ik heb ondertussen eens geprobeerd 2000 mails (naar mezelf :p) te versturen. De server stopte de eerste keer na +-650 mails, de tweede keer na 500.
Oplossing ervoor: de server soms es ff laten rusten :) Ik verstuur nu telkens 100 mails, waarna ik een sleep() van 5 seconden inpas. Deze zorgt ervoor dat de server probleemloos de 2000 mails verstuurt. Nadeel natuurlijk, is dat het ietsje trager gaat :p

Voor te versturen gebruik ik nu de mail()-functie. Deze is voor mass mail wel niet zo geschikt, aangezien die naar het schijnt altijd de connectie opent & sluit. Omdat ze gepersonaliseerd moeten zijn (1 input in het 'To'-fieldje), zie ik op dit moment geen andere keuze.

Atm heb ik 1 vrij irritant probleem: ik wil namelijk na elke mail een report zien, om te weten of de mail succesvol is verstuurd. Aangezien php serverside is, en dus execute VOOR de pagina laadt, lukt dit mij niet. Met een javascriptje te echo'en na elke mail, komt er wel een pagina update om de +-100 mails. Daarmee is er een stuk van de efficiëntie verloren. Wat als de server crasht gedurende het mailen? Dan krijg ik niets van output, en mag ik raden welke mails er al verzonden zijn.

Weet er dus iemand hoe ik dit kan omzeilen? :oink:

thx :)

RpR

Legacy Member
Nadeel van sleep is dat ge uwen timeout tijd van server moet hoger zetten.
Wij sturen hier mailing van 9000 man. En dit 20 emails en dan 30 seconde pauze (Microsoft exchange server...) en dit neemt 6 uur in beslag.

En ik ben aan het scripten op nen windows en gebruik php 4.xx waardoor sleep niet werkt :)

RpR

Legacy Member
.Nighthawk. zei:
ik heb ondertussen eens geprobeerd 2000 mails (naar mezelf :p) te versturen. De server stopte de eerste keer na +-650 mails, de tweede keer na 500.
Oplossing ervoor: de server soms es ff laten rusten :) Ik verstuur nu telkens 100 mails, waarna ik een sleep() van 5 seconden inpas. Deze zorgt ervoor dat de server probleemloos de 2000 mails verstuurt. Nadeel natuurlijk, is dat het ietsje trager gaat :p

Voor te versturen gebruik ik nu de mail()-functie. Deze is voor mass mail wel niet zo geschikt, aangezien die naar het schijnt altijd de connectie opent & sluit. Omdat ze gepersonaliseerd moeten zijn (1 input in het 'To'-fieldje), zie ik op dit moment geen andere keuze.

Atm heb ik 1 vrij irritant probleem: ik wil namelijk na elke mail een report zien, om te weten of de mail succesvol is verstuurd. Aangezien php serverside is, en dus execute VOOR de pagina laadt, lukt dit mij niet. Met een javascriptje te echo'en na elke mail, komt er wel een pagina update om de +-100 mails. Daarmee is er een stuk van de efficiëntie verloren. Wat als de server crasht gedurende het mailen? Dan krijg ik niets van output, en mag ik raden welke mails er al verzonden zijn.

Weet er dus iemand hoe ik dit kan omzeilen? :oink:

thx :)
Ben zelf beginner in php maar heb ooit gelezen dat er een commando flush is dat al output geeft maar uw pagina laat verder laden.

NaaiT

Legacy Member
RpR zei:
Ben zelf beginner in php maar heb ooit gelezen dat er een commando flush is dat al output geeft maar uw pagina laat verder laden.
goh thx, deze werkt idd :)

dJeez

Legacy Member
.Nighthawk. zei:
Weet er dus iemand hoe ik dit kan omzeilen? :oink:
Ja, door te werken via een cron script. Enerzijds heb je je web interface waar je het signaal doorgeeft dat er een mailing verstuurd moet worden. Anderzijds heb je een script in de crontab dat op gezette tijden draait en controleert of er een mailing verstuurd moet worden (hoe je dat doet is eigenlijk niet zo belangrijk, kan via bestand, DB, ...).

En hoe kan je traceren welke mails er verstuurd werden? Wel, vb. door na het (succesvol) versturen van een email naar een bepaald adres een statusveld van het overeenstemmende record in de DB te wijzigen (ervan uitgaande dat je een DB gebruikt). Dan weet je exact wie er al dan niet de mail reeds heeft ontvangen en kan je dus ook bij onverwachte problemen verdergaan zonder dubbels te versturen.

Er zijn mail queueing scripts voldoende eigenlijk - ff zoeken levert een hele resem op (sommigen daarvan passen bovenstaande techniek trouwens ook toe om de mails in pakketjes - een 100 per keer - door te sturen).

BTW Er zit ook een Mail_Queue klasse in PEAR die bovenstaande technieken perfect omkapselt.

NaaiT

Legacy Member
Die PEAR heb ik ook al tegengekomen, maar niet gebruikt omdat ik het enerzijds niet zo goed snap, en dat ze anderzijds alle users gezamelijk in het "To"-veldje zetten. Dit zorgt voor minder persoonlijke mails.

De werkelijke daad van het verzenden wordt niet in een database/bestand opgenomen. Ik ga wel een uitgebreide db maken voor users/usergroups, waarnaar je dus kan mailen.

Die flush() werkt voor mij goed genoeg, het zal mss wat minder secure zijn, maar voor mij ligt dit al moeilijk genoeg :) Nu heb ik gewoon nog het 'schoonheidsfoutje', dat de browser bovenaan blijft staan als de lijst gegenereerd wordt. Deze zou na elke toegevoegde waarde, moeten meeschuiven naar onder. Ik heb atm al vanalles & nog wat geprobeerd, van header(), javascriptgedoe tot metatags, maar niets werkt. Het meeste zorgt er gewoon voor, dat de pagina pas naar de bottom verspringt, eens de lijst al volledig is.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan