28. januar 2003 - 20:27
#1
du kan gøre to(tre) ting :
enten bruger du en decideret mailingliste-manager (mailman, mlm/qmail etc...)
eller også laver du et system, der via crontab (hvis du er på en linuxserver) kører et script, som smider mailsne afsted en efter hinanden ...
en sidste mulighed er at smide alle dine modtagere i Bcc-feltet - på den måde kan du med een mail nå ud til mange modtagere (men det virker bare ikke altid lige godt)
jeg har selv gjort noget a la nr. 2 ... når jeg engang får tid til at rydde op i koden lægger jeg den nok i open-source, men indtil da ...
den første løsning er bestemt den mest solide, og bortset fra installationen af selve maillistmanageren (som din systemadministrator skal klare) er det også ret nemt at have med at gøre ...
28. januar 2003 - 21:36
#4
Kunne en af jer ikke forklare i hvordan jeg kommer igang med at bruge denne kode, har ikke prøvet at arbejde med oop !!
<?php
<%
// smtp_client class -------------------------------------------------------
// use:
// $smtp=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");
}
}
%>
?>
Example
$smtp=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();
28. januar 2003 - 22:45
#5
Her er et eksempel på, hvordan du kan bruge den:
//inkluder en separat fil som indeholder klassen
include('smtpklassefil.php');
//udtræk fra db
$res = mysql_query("select to_email, to_name from maillisttable");
//mail data
$from = '"Dit navn" <din@email.dk>';
$header = 'Reply-To: nr2@email.dk>' //hvis anden reply-to end afsender-email
$subject = 'Emne for mailen';
$body = 'Alt hvad der skal stå i mailen!';
//lav et nyt objekt af smtp-typen
$smtp = new smtp_client;
while (list($to, $to_name) = mysql_fetch_row($res)) {
$smtp->email($from, $to, $to_name, $header, $subject, $body);
}
$smtp->send();
28. januar 2003 - 23:10
#7
->Tipsen
Lige på faldrebet...
Jeg har prøvet at køre dette script:
include('smtpklassefil.php');
$smtp = new smtp_client;
$smtp->email('svendage', 'minhotmail@hotmail.com', 'svendage', 'test', 'test', 'test');
$smtp->send();
Men får 16 af dem her:
Warning: fopen("./smtp_client.log", "a") - Permission denied in /hotel/mojito/WWW/test/smtpklassefil.php on line 83
Er det fordi mit webhotel(DHT) nægter mig adgang til en eller anden feature som er bygget ind i denne klasse ?
29. januar 2003 - 00:45
#8
Du laver ét objekt, laver en masse mails og sender dem alle - det kræver kun ét objekt... - Jeg ved ikke rigtigt hvordan jeg skal forklare det - finessen er at der åbnes en forbindelse til smtp-serveren og det hele sendes på én gang hvorimod, mail-funktionen ville åbne og lukke forbindelsen for hver eneste mail og den operation tager *lang* tid, hvorfor vi her undgår den!
Det problem du får er åbenbart, at klassen gerne vil oprette en log-fil, til log-resultater af kørslen. Prøv at oprette filen smtp_client.log og giv den de rigtige rettigheder vha. chmod()!