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