Avatar billede martinkjaer Nybegynder
05. juli 2004 - 22:04 Der er 7 kommentarer og
1 løsning

mail-funktion

Hej,

Jeg har brug en hurtig og effektiv måde, at sende et nyhedsbrev ud på. Pt. har jeg database i mysql, som jeg kører igennem med en while-løkke og mail-funktionen i PHP. Det tager dog så lang tid, at det skaber problemer med timeout ol. på serveren.

Jeg er så blevet belært om, at det hænger sammen med, at der åbnes og lukkes en smtp-forbindelse ved hver medlem af nyhedsbrevet, og at jeg burde åbne én forbindelse til smtp-serveren, sende alle breve, og først da lukke forbindelsen igen.

Jeg har sitet liggende på et webhotel hos enavn.dk, og er dermed afhængig af adgang til deres smtp-server ( formoder jeg ).

Er der en dygtig og venlig sjæl som kan/vil hjælpe mig med konkrete løsningsforslag til ovenstående. Jeg har tidligere forsøgt at installere en 'stmp-class' på siden, men uden held.

Husk, at jeg skal kunne bruge løsningen med enavn's webhotel.

Hilsen
Martin
Avatar billede googolplex Novice
06. juli 2004 - 00:36 #1
Har du prøvet denne klasse, den virker i hvert fald hos undertegnede:

<?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 googolplex Novice
06. juli 2004 - 00:37 #2
Så gør du således:

$smtp= new smtp_client('dinserver');

// Kører en form for løkke, der udskriver:

$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]);

// Osv.

$smtp->send();
Avatar billede martinkjaer Nybegynder
06. juli 2004 - 12:56 #3
Hej,

Jeg har nu uploadet koden i nedenstående form. Der bliver bare ikke sendt nogen mail ud. Skal scriptet ikke logge på smtp-serveren med et password osv. eller hur? Hvordan tager jeg næste skridt?

hilsen
Martin


<?
$smtp= new smtp_client('domæne.dk');
$smtp->email('Afsender', 'mak@kjaer-internet.dk', 'Martin', '', 'Test af mailsender', 'Der er ikke noget indhold - endnu!');
$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 martinkjaer Nybegynder
06. juli 2004 - 13:15 #4
Log'en ser således ud:


-------------------------------------------
Sent 2004-07-06 13:15:35
-------------------------------------------
    220 ds48.dotserv.net ESMTP Sendmail 8.10.2-SOL3/8.10.2; Tue, 6 Jul 2004 13:15:35 +0200

HELO xyz

    250 ds48.dotserv.net Hello ds48.dotserv.net [193.201.35.63], pleased to meet you

MAIL FROM:Afsender
    553 5.5.4 Afsender... Domain name required

RCPT TO:mak@kjaer-internet.dk
    503 5.0.0 Need MAIL before RCPT

DATA
    503 5.0.0 Need MAIL command

Subject: Test af mailsender
To: Martin

Der er ikke noget indhold - endnu!
.
    500 5.5.1 Command unrecognized: "Subject: Test af mailsender"
Avatar billede martinkjaer Nybegynder
06. juli 2004 - 13:19 #5
Hej

Har nu kigget selv kigget lidt på loggen - og fået det til at virke. Helt perfekt. Jeg tester lidt, og vender tilbage med flere spørgsmål.

Vil du, googolplex, poste et svar?

hilsen
Martin
Avatar billede martinkjaer Nybegynder
06. juli 2004 - 13:56 #6
Hej,

Jeg har nu leget lidt med denne 'smtp-class' og der ser ud til, at det ikke går hurtigere end med den almindelige mail-funktion i php. Og det var jo netop hastighed som var udgangspunktet i mit problem/spørgsmål.

min løkke ser nogenlunde sådan her ud:

$smtp= new smtp_client('domæne.dk');

while ($data = mysql_fetch_array($send))
    {
    $indhold = "<font face=\"Trebuchet MS\" size=\"3\">Test</font>";
    $emne = "Test";
    $smtp->email('post@xxx.dk', 'mak@xxx.dk', $smtp_navn, 'From: "Exxx" <nyhedsbrev@xxx.dk>', $emne, $indhold);
    }

$smtp->send();

Hvad mon stjæler tiden?

hilsen
Martin
Avatar billede googolplex Novice
06. juli 2004 - 14:46 #7
Nej, det er nemlig ikke sikkert at det går hurtigere ved at sende direkte via smtp, flere faktorer spiller ind. Morten Fangel skrev noget om hvornår det kunne betale sig, men jeg kan ikke finde det. Prøv at søg på smtp :)
Avatar billede martinkjaer Nybegynder
08. august 2004 - 11:09 #8
Lukkes her!
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