webForumDet fria alternativet

Egen mailklass med phpMailer och mallhantering

PHP

2 svar · 559 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej

Jag har byggt en egen mailklass som använder sig av phpMailer för att skicka mail. Såhär ser det ut:

MyClass.php

require("phpMailer/class.phpmailer.php");

Class MyMailer extends PHPMailer {

// __construct och allt annat som är bra...

    public function parseMail(){
        $data = $this->template;
        foreach($this->vars as $key => $value){
            $data = str_replace($key, $value, $data);
        }
        return $data;
    }

    public function setTemplate(){
        $template = $this->template;
        $fp = fopen($template, "r");
        $data = fread($fp, filesize($template));
        fclose($fp);
        $this->template = $data;
        return $data;
    }
}

SendMail.php

function replaceVars($data, $vars = array()){
    foreach($vars as $key => $value){
        $data = str_replace($key, $value, $data);
    }
    return $data;
}
...
$mail = new MyMailer();
...
while($res = mysql_fetch_assoc($result)){
    $vars = array(
                    "{USER_NAME}"    => $res['user_name'],
                    "{FIRST_NAME}"    => $res['user_firstname'],
                    "{LAST_NAME}"    => $res['user_lastname']
                );
    
    $mail_body = replaceVars($res['mail_body'], $vars);
    $mail->template = ROOTPATH . "inc/template.newsletter.htm";
    
    if(!$mail->SetTemplate() == false){
        $mail->vars = array(
                            "{SKINPATH}"         => SKINPATH,
                            "{CONTENT}"             => $mail_body,
                            "{DATETIME}"         => date("Y-m-d H:i:s"),
                            "{IPADDR}"             => $_SERVER['REMOTE_ADDR']
                            );

        $msgBody = $mail->parseMail();
        $mail->MsgHTML($msgBody);

        $mail->AddAddress($res['user_email'], $res['user_firstname'] . " " . $res['user_lastname']);

        $mail->SetFrom(MAIL_FROM, MAIL_FROMNAME);
        $mail->Subject = $res['mail_subject'];

        if($mail->Send()){
            $numMail++;
        }else{
            echo $mail->ErrorInfo . "<br />";
        }
        $mail->ClearAddresses();
        $mail->ClearCCs();
        $mail->ClearBCCs();
        $mail->template = null;    
    }
}
$mail = null;
...

När jag kör ovanstående för att skicka massmail har vissa hört av sig att det står fel namn osv. i mailen. Det händer inte hela tiden och inte hos alla som använder sig av scriptet, men hos vissa. Därför misstänker jag att det sker något konstigt när $vars osv ersätts i loopen.

Någon som ser några direkta fel i ovanstående, eller finns det något jag kan göra annorlunda för att det ska bli bättre? Det här är väldigt svårt att felsöka eftersom när jag använder scriptet för att skicka till mig själv blir det rätt, felet uppkommer när man skickar till > 100 eller där i krokarna.

Tycker det borde funka som det är nu med tanke på att jag sätter $template = null vid varje loop.

Tacksam för förslag!

Medlem sedan sep. 20051 758 inlägg
#2

Det händer ibland att jag på mitt yahookonto får mail som skulle gå till någon annan, och denne har alltid också ändelsen yahoo.se och, tror jag i alla fall, alltid samma startbokstäver som jag. Är det liknande för dig?

Ex. du har 2 adressater med adresserna leif@yahoo.se respektive lena@yahoo.se och du skriver ett mail till Leif med texten:

"Hej Leif

osv osv"

Men det blir Lena som får det istället?

Eller påminner det inte alls om hur det är för dig? Jag har inget direkt svar på din fråga eller förslag på hur det ska lösas. Tog bara upp ett exempel på hur det är när jag tar emot e-post ifall det liknar ditt problem.

Medlem sedan feb. 20034 441 inlägg
#3

En sak som slog mig... I nuläget initierar jag klassen innan min while-loop, undra om man inte skulle testa att initiera den inuti loopen och stänga den efter varje varv? Kommer jag tappa mycket prestanda på det? Variablerna verkar ju inte "släppa", så vet inte riktigt hur jag ska lösa det här.

252 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)