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
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
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"); } } } ?>
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();
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"); } } } ?>
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"
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
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
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 :)
08. august 2004 - 11:09
#8
Lukkes her!
Vi tilbyder markedets bedste kurser inden for webudvikling