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
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