Avatar billede technodance.dk Nybegynder
15. december 2003 - 03:39 Der er 7 kommentarer og
1 løsning

Send post til alle bruger!

hej i stuen

Har et post-system med ca. 150 bruger. Det jeg mangler er at kunne skrive til alle på en gang...kan i hjælpe?

har lavet systemet, mangler bare funktion til at sende til alle bruger.
Avatar billede detox Nybegynder
15. december 2003 - 04:42 #1
Du kan adskille modtagerne i mail() med et komma, det vil nok være i overkanten med så mange modtagere. Desuden vil det medføre at alle modtagerne kan se alle andres adresser.
Du kan osse vælge at køre det i en løkke og sende hver enkel med mail(). Så skal du muligvis ændre timeout for dit script eller sende fx 50 ad gangen.
En tredie mulighed er at bruge en smtp class, der kommunikerer direkte med serveren.
Avatar billede nicklasb Nybegynder
15. december 2003 - 07:08 #2
vil holde på den sidste mulighed.. :D
Der er igen grund til at skyde en server i sænk, med dårlige (læs: forkerte) funktioner, eller lange krumspring for at rette op på en dårlig funktion..
Vælg hellere en klasse der er lavet til at sende en masse mails..
Avatar billede googolplex Novice
15. december 2003 - 09:30 #3
Jeg lavede følgende i forbindelse med noget test:

<?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");
        }
    }
}

// Så sendes der

$smtp = new smtp_client('smtp1.b-one.net');

$fra = 'mailingliste@domaene.dk';
$til[] = 'mail1@adslhome.dk';
$til_navn[] = 'mail@adslhome.dk';
$til[] = 'mail2@tdcadsl.dk';
$til_navn[] = 'mail2@tdcadsl.dk';
$header = '';
$emne = 'Testmail';
$besked = 'Her skrives beskeden';

$antal = sizeof($til);

for ($i = 0; $i < $antal; $i++) {
    $smtp->email($fra, $til[$i], $til_navn[$i], $header, $emne, $besked);
}

$smtp->send();

?>

Er ikke 100% klat over hvad forskellen på $til og $til_navn er, det kan være en af de andre ved det.

Fordelen ved at sende direkte via smtp-serveren er, at den nøjes med at åbne og lukke for serveren én gang, mail() åbner og lukker hver eneste gang den sender en mail.

Husk at ændre til din egen smtp-server :)
Avatar billede technodance.dk Nybegynder
15. december 2003 - 14:29 #4
det er en besked der skal ligge sig i database 150 gange med hvert chat_navn
Avatar billede ultragames Nybegynder
15. december 2003 - 14:29 #5
hmm!. nu er jeg ikke en haj til mail scripts i PHP.. men skal du ikke have tilladelse for at må sende så mange mails over deres smtp?
Avatar billede technodance.dk Nybegynder
15. december 2003 - 14:35 #6
men sorry gå på en database det der post-system
Avatar billede nicklasb Nybegynder
15. december 2003 - 15:22 #7
googolplex -> Det er ikke dig der har lavet den ;)
og forskellen er hvis du læser teksten til på zend's side, navn og email-adresse..
Altså det navn som skal optræde i mail-clienten.. Altså modtagerens mail-program..
I dit eksempel har du blot valgt det samme som mailen, og det er for sin vis også helt fint.. Men hvis du fx havde flere oplysninger i databasen, som fx fornavn og efternavn kunne du jo i stedet skrive "Hr. Jensen, Jan", eller ligende..

og det med post til alle.. En mulighed kunne være en lille omstrukturering i dine databaser.. Hvis du i stedet lavet én tabel der indeholdte mailen, og et id, samt afsendes id og en tid, men undladte modtagerens mail her, kunne du nu oprette enddnu en tabel kun til henvisning til brugere og specifik mail..

Altså så du i den ene tabel har selve mailen, og i en anden nu blot skriver en henvisning til mailen via et id og en henvisning til modtageren ligeledes via et id.. Så har du kun to tal pr mail til resten af personerne..
Det er én af måderne at gøre det på, og også en god en!! :D
Spørg endelig hvis du ikke fatter hvad jeg mener, men sku svært at forklare..
Avatar billede googolplex Novice
27. december 2003 - 23:30 #8
technodance: Har du fået det til at fungere efter hensigten ?
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