Avatar billede donslund Nybegynder
09. januar 2006 - 19:07 Der er 21 kommentarer og
1 løsning

SMTP_client class ra Zend viser ingenting.

Jeg vil gerne sende flere mails på den mest hensigtmæsasige måde. Tester med følgende, men udne resultat overhovedet.

<?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 xyzrn", 1);
        fputs($this->connection,"HELO xyzrn");
        $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_mailrn");
        $this->elog(fgets($this->connection, 1024));

        $this->elog("RCPT TO:$to_mail", 1);
        fputs($this->connection, "RCPT TO:$to_mailrn");
        $this->elog(fgets($this->connection, 1024));

        $this->elog("DATA", 1);
        fputs($this->connection, "DATArn");
        $this->elog(fgets($this->connection, 1024));
   
        $this->elog("Subject: $subject", 1);
        $this->elog("To: $to_name", 1);
        fputs($this->connection,"Subject: $subjectrn");
        fputs($this->connection,"To: $to_namern");

        if ($header) {
            $this->elog($header, 1);
            fputs($this->connection, "$headerrn");
            }

        $this->elog("", 1);
        $this->elog($body, 1);
        $this->elog(".", 1);
        fputs($this->connection,"rn");
        fputs($this->connection,"$body rn");
        fputs($this->connection,".rn");
        $this->elog(fgets($this->connection, 1024));

        return 1;
        }


    function send() {
        if ($this->connection) {
            fputs($this->connection, "QUITrn");
            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, "    $textn");
        else fwrite($this->elog_fp, "$textn");
        }
    }
?>

<?
include("../config.php");
$hent = "Select * from ".$users_tbl." where email != '' and medlem > 1";
//print $hent;
$koer_hent=mysql_query($hent);
    $from = "mail@mctorsdagsklubben.dk";
    $header = "Content-type: text/plain; charset=ISO-8859-1";
    $subject = "dit emne";
    $body = "din besked";
    $email = "jeppe@donslund.net";
    $smtp=smtp_client();
    print "smtp = ".$smtp;
while($row=mysql_fetch_array($koer_hent)){
    print $row["fornavn"];
    $smtp->email($from, $email, $row["fornavn"], $header[0], $subject[0], $body[0]);
    }
$smtp->send();
//header("location:showpage.php?inc=mailsend");
?>
Avatar billede rednex Nybegynder
09. januar 2006 - 20:00 #1
Du må lige gøre dig lidt mere umage med problem beskrivelsen. Hvad gør den, hvad gør den ikke? Får du nogen fejlmeddelelser - hvilke?
Avatar billede donslund Nybegynder
09. januar 2006 - 20:52 #2
Jeg får ingen fejlmeddeleser. Ovenstående giver blank skærm. Ikke engang indholdet af $row["fornavn"] giver resultat.
Avatar billede rednex Nybegynder
09. januar 2006 - 21:00 #3
ok, så prøver vi for 7. gang idag :o)

Indsæt følgende linier i toppen af dit script:

error_reporting(E_ALL);
ini_set('display_errors', '1');

Så skulle den gerne spytte fejlmeddelelser efter dig hvis/når du laver ulykker :o) Husk at fjerne dem inden sitet går 'live'.

Hvis du har en lokal server til udvikling er det en god idé at rette disse to settings i php.ini istedet for at skrive dem i samtlige scripts.

Hvis du indsætter linierne
Avatar billede donslund Nybegynder
09. januar 2006 - 21:10 #4
Fejl:

Fatal error: Call to undefined function: smtp_client() in /customers/mctorsdagsklubben.dk/mctorsdagsklubben.dk/httpd.www/medlem/sendcommail2.php on line 109
Avatar billede rednex Nybegynder
09. januar 2006 - 21:17 #5
Ahh, der er en bøf i instruktionerne.

Ret linien "$smtp=smtp_client();" til "$smtp=new smtp_client();"
Avatar billede donslund Nybegynder
09. januar 2006 - 21:36 #6
Warning: fsockopen(): unable to connect to localhost:25 in /customers/mctorsdagsklubben.dk/mctorsdagsklubben.dk/httpd.www/medlem/sendcommail2.php on line 24

Men det har nok noget at gøre med, at de kører på et unoeuro webhotel.
Avatar billede donslund Nybegynder
09. januar 2006 - 21:45 #7
Rettelse: Det er hos b-one.dk

customer-smtp.b-one.net på port 2525 skulle være åben.
Avatar billede rednex Nybegynder
09. januar 2006 - 21:48 #8
Det vil jeg tro. Jeg tvivler på at de kører en mailserver på samtlige servere.

Hvis de ikke har firewall som beskytter for udgående connections (og det har de fleste webhoteller), så kan du benytte en anden mailserver i stedet. Men jeg tror ikke du skal sætte forhåbningerne for højt :o|
Avatar billede rednex Nybegynder
09. januar 2006 - 21:49 #9
OK, missede lige din anden kommentar. Så er der jo lys for enden af tunnelen alligevel :o)
Avatar billede donslund Nybegynder
09. januar 2006 - 21:59 #10
Selv om jeg sætter var $server = "customer-smtp.b-one.net", så kommer den og siger: Warning: fsockopen(): unable to connect to localhost:2525
Avatar billede rednex Nybegynder
09. januar 2006 - 22:11 #11
Normalt er det ikke nødvendigt (eller hensigtsmæssigt) at rette i selve klassen. Constructoren tager 1 parameter, som er mailserverens adresse. Hvis ikke den er udfyldt vil den bruge localhost.

Vi er dog nødt til at rette lidt alligevel, da vi ikke skal bruge standard porten (25).

Ret starten af klassen så den kommer til at se sådan ud:
<snip>
class smtp_client {
    var $connection;
    var $server;
    var $port; //-- Indsat variabel som indeholder portnummeret
    var $elog_fp;
    var $log_file='./smtp_client.log';
    var $do_log=true;
 

    // default constructor
    function smtp_client($server='', $port = 25) { //-- Indsat parameter for port
        if (!$server) $this->server="localhost";
        else $this->server=$server;
       
        $this->port = $port; //-- Gem porten

        $this->connection = fsockopen($this->server, $this->port); //-- Brug det gemte portnummer
        if ($this->connection <= 0) return 0;
</snip>

Desuden skal du rette linien $smtp=new smtp_client(); til $smtp=new smtp_client('customer-smtp.b-one.net', 2525);
Avatar billede donslund Nybegynder
09. januar 2006 - 22:33 #12
Den fejler men henvisning til de linier hvor der står eks. $subjectrn.
Alle linier der fejler er der en variable med rn tilføjet. Skal jeg bare slette dette rn eller hvad gør det godt for?
Avatar billede rednex Nybegynder
09. januar 2006 - 22:41 #13
Jeg har fundet et par af de linier hvor der er variabler der slutter med rn. Jeg er rimelig sikker på at det skyldes at der er blevet fjernet nogle backslashes.

De steder hvor den laver noget med $xxxrn skal du lige erstatte rn med \r\n (altså linieskift).
Avatar billede rednex Nybegynder
09. januar 2006 - 22:43 #14
I det hele taget, alle steder hvor der står noget i gåseøjne " og der optræder enten n eller rn skal du lige erstatte med hhv. \n og \r\n
Avatar billede donslund Nybegynder
09. januar 2006 - 22:47 #15
Nu sender den mailsne, men den er umanerlig længe om det og ender ud i en Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, support@b-one.net and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
Avatar billede rednex Nybegynder
09. januar 2006 - 22:53 #16
Fejlmeddelelsen skyldes at scriptet ikke når at blive færdigt indenfor de 30 sekunder som normalt er timelimit. Det vil sige at scriptet bliver "slagtet" af serveren.

Jeg kunne godt forestille mig at det kunne tage noget tid hvis du har 1 million adresser i din database. Har du prøvet at nøjes med en enkelt mail eller 2 til at starte med?
Avatar billede donslund Nybegynder
09. januar 2006 - 22:55 #17
der er ca. 50.
Prøver med lidt mindre.
Avatar billede donslund Nybegynder
09. januar 2006 - 22:59 #18
Ja, denne gang var der hul igennem. Så må jeg bare se hvad jeg gør ved den der time_out.
Avatar billede rednex Nybegynder
09. januar 2006 - 23:11 #19
Jeg vil tro at grunden til at det tager så lang tid, skyldes at mailserveren indsætter en lille venteperiode imellem hver mail. Den slags er meget normalt, da det gør det lidt kedeligt at sende en million spam mails hvis man skal vente 1-2 sekunder mellem hver mail.

Hvis hver mail skal være ens (altså ikke indeholde f.eks. profilnavn eller sådan noget), kan du måske benytte dig af Bcc headeren. Den svarer til Cc headeren, men modtagerne af mailen kan ikke se hvem den ellers er sendt til. På den måde kan hver mail blive sendt til f.eks. 10 forskellige bruger. Så skal du kun have 1/10 så mange mails i kø på serveren.
Avatar billede rednex Nybegynder
09. januar 2006 - 23:12 #20
...Og nu håber jeg forresten ikke at du bruger den rigtige database til at teste med. Det kan godt være at dine brugere vil blive en anelse irriteret over at modtage alle dine testmails ;o)
Avatar billede donslund Nybegynder
09. januar 2006 - 23:14 #21
Nej, naturligvis ikke. :-)

Tak for hjælpen.
Avatar billede rednex Nybegynder
09. januar 2006 - 23:17 #22
Det var så lidt :o)
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