Avatar billede mkjaer Nybegynder
11. januar 2004 - 12:16 Der er 4 kommentarer og
1 løsning

Afsendelse af nyhesrbeve via MySQL

Hejsa,

Jeg sender et nyhedsbrev til ca. 1.000 email-adresser via en while-løkke. Jeg har fået webhotelllet til at øge timeout'en til 60 sekunder, men jeg kunne godt tænkte mig, at opdele afsendelse i flere bidder.

Mit spørgsmål er så hvordan dette gøres smartest, så jeg stresser serveren mindst muligt. Skal jeg blot lave flere while-løkker i samme script, eller skal jeg fordele afsendelsen over flere scripts? ( og hvordan kunne man forestille sig, at det kunne gøres? )

PFH tak,
Hilsen
Martin
Avatar billede fangel Nybegynder
11. januar 2004 - 12:19 #1
1) lave egne / finde en STMP klasse, da mail() åbner forbindelse, sender, lukker igen...

ved egen klasse / funden SMTP klasse kan du oprette forbindelse, sende alle mails og så lukke- det spare de mange oprettelser af forbindelser...

på den måde kan det være du kan nå det på 60 sek...

Morten
Avatar billede mkjaer Nybegynder
11. januar 2004 - 12:24 #2
Ok, det lyder da fint. Men er du ikke sød, at uddybe 'egen SMTP-klasse' lidt for mig. Kræver det hjælp fra webhotellet, eller kan jeg klare det 'selv'?
Avatar billede googolplex Novice
11. januar 2004 - 12:36 #3
Her er en smtp-klasse som dea_pg hentydede til:

<?php


// smtp_client class -------------------------------------------------------
// use:
//        $smtp= new smtp_client();
//        $smtp->email($from, $to[0], $to_name[0], $header[0], $subject[0], $body[0]);
//        $smtp->email($from, $to[1], $to_name[1], $header[1], $subject[1], $body[1]);
//        $smtp->send();

class smtp_client {
    var $connection;
    var $server;
    var $elog_fp;
    var $log_file = './smtp_client.log';
    var $do_log = true;
   
    /* default constructor */
    function smtp_client($server = '') {
        if (!$server) {
            $this->server = 'localhost';
        } else {
            $this->server = $server;
        }
       
        $this->connection = fsockopen($this->server, 25);
       
        if ($this->connection <= 0) {
            return 0;
        }

        $this->elog(fgets($this->connection, 1024));
        $this->elog("HELO xyz\r\n", 1);
        fputs($this->connection, "HELO xyz\r\n");
        $this->elog(fgets($this->connection, 1024));
    }

    function email($from_mail, $to_mail, $to_name, $header, $subject, $body) {
        if ($this->connection <= 0) {
            return 0;
        }
   
        $this->elog("MAIL FROM:$from_mail", 1);
        fputs($this->connection, "MAIL FROM:$from_mail\r\n");
        $this->elog(fgets($this->connection, 1024));

        $this->elog("RCPT TO:$to_mail", 1);
        fputs($this->connection, "RCPT TO:$to_mail\r\n");
        $this->elog(fgets($this->connection, 1024));

        $this->elog("DATA", 1);
        fputs($this->connection, "DATA\r\n");
        $this->elog(fgets($this->connection, 1024));
   
        $this->elog("Subject: $subject", 1);
        $this->elog("To: $to_name", 1);
        fputs($this->connection, "Subject: $subject\r\n");
        fputs($this->connection, "To: $to_name\r\n");

        if ($header) {
            $this->elog($header, 1);
            fputs($this->connection, "$header\r\n");
        }

        $this->elog('', 1);
        $this->elog($body, 1);
        $this->elog('.', 1);
        fputs($this->connection, "\r\n");
        fputs($this->connection, "$body \r\n");
        fputs($this->connection, ".\r\n");
        $this->elog(fgets($this->connection, 1024));

        return 1;
    }

    function send() {
        if ($this->connection) {
            fputs($this->connection, "QUIT\r\n");
            fclose($this->connection);
            $this->connection = 0;
        }
    }

    function close() {
        $this->send();
    }

    function elog($text, $mode = 0) {
        if (!$this->do_log) {
            return;
        }

        /* Open file */
        if (!$this->elog_fp) {
            if (!($this->elog_fp = fopen($this->log_file, 'a'))) {
                return;
            }
            fwrite($this->elog_fp, "\n-------------------------------------------\n");
            fwrite($this->elog_fp, " Sent " . date("Y-m-d H:i:s") . "\n");
            fwrite($this->elog_fp, "-------------------------------------------\n");
        }

        /* Write to log */
        if (!$mode) {
            fwrite($this->elog_fp, "    $text\n");
        } else {
            fwrite($this->elog_fp, "$text\n");
        }
    }
}

?>
Avatar billede mkjaer Nybegynder
11. januar 2004 - 16:42 #4
Hejsa,

Jo, det ser godt ud. Men hvordan bruger jeg dette? Skal jeg bare uploade scriptet, og kalde funktionerne?

Måtte jeg ikke allernådigt bede om, en eksempel på hvordan man sender en mail fra ovenstående 'klasse'.

hilsen
Martin
Avatar billede fangel Nybegynder
11. januar 2004 - 20:25 #5
det står faktisk som kommentar til scriptet... se her:

// use:
//        $smtp= new smtp_client();
//        $smtp->email($from, $to[0], $to_name[0], $header[0], $subject[0], $body[0]);
//        $smtp->email($from, $to[1], $to_name[1], $header[1], $subject[1], $body[1]);
//        $smtp->send();

dvs

1) brug $smtp = new smtp_client('din.smtp.server.dk');

2) lav et loop der kører gennemdatabasen og kalder "$smtp->email($fra, $til, $til_navn, $evt_headere, $emne, $indhold);

3) lav en $smtp->send():

Morten
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester