Avatar billede zac Nybegynder
27. november 2005 - 23:36 Der er 15 kommentarer og
1 løsning

Hvordan få $mail->AddAddress("text") til i.s.f. at sluge en $var

Jeg forsøger at lave send e-mail ved brug af PHPMailer klassen (http://phpmailer.sourceforge.net).
Jeg har e-mail adresser fra en MySQL tabel, kommer ud som $email.
Jeg har et indhold fra en MySQL tabel, kommer som $message.

Klassen class.phpmailer.php definerer fx:
$mail->Body = "hi ! \n\n this is First mailing I made myself with PHPMailer !";
Her går det fint med at indsætte min $message: $mail->Body = $message;

Men så er det, jeg ikke kan lege godt nok med classen!
Exemplet er: $mail->AddAddress("myfriend@site.com");
Funktionen AddAddress    defineret således:
    function AddAddress($address, $name = "")
    {
        $cur = count($this->to);
        $this->to[$cur][0] = trim($address);
        $this->to[$cur][1] = $name;
    }
   
Hvordan får jeg variablen $email med - så alle får emailen?

Det her giver kun den første email adresse fra tabellen:
$result1 = mysql_query( "SELECT email FROM emailliste" );
while ($row1 = mysql_fetch_array($result1))
{   
        $address                = $row1["email"];
        $fornavn              = $row1["fornavn"];
        $efternavn            = $row1["efternavn"];
        $name = $fornavn . $efternavn;        
        require("class.phpmailer.php");
        ....       
        $mail->AddAddress($address, $name); //sender altså kun til første email adresse i tabellen
        ....       
}
Avatar billede jakobdo Ekspert
28. november 2005 - 07:48 #1
Inde i din while...
Skal du lave:
while(...)
{
$mail->AddAddress($address, $name);
$mail->Send();
$mail->ClearAddresses();
}
Avatar billede Slettet bruger
28. november 2005 - 13:04 #2
Derudover bør du nok gøre følgende ting:

- flytte den require op før while-løkken (eller lave den om til require_once)
- Sætte et mellemrum mellem for- og efternavn. Jeg vil foreslå
  $name=trim($fornavn . " " . $efternavn);
Avatar billede zac Nybegynder
28. november 2005 - 14:02 #3
Well, det er sandbox's forslag med at flytte require uden for løkken, som gør forskellen - så det nu virker! Tak - point!?

jakobdos forslag om at tilføje
$mail->Send();
$mail->ClearAddresses();
giver denne fejl: Language string failed to load: provide_address
Er det fordi funktionerne så gentages?
Avatar billede Slettet bruger
28. november 2005 - 14:24 #4
jakobdo har nu også ret. Hvis hans forslag ikke passer til din kode, er det nok fordi vi ikke fik hele din kode, men den generelle struktur for brugen af phpmailer til at sende til en flok adresser fra database er:

require_once("class.phpmailer.php");
$mail = new PHPMailer();

// opsætning for mailserver, afsender og lign

// Hvis Body skal være ens på alle mails, laves den her

$result1 = mysql_query( "SELECT email FROM emailliste" );
while ($row1 = mysql_fetch_array($result1))

  $address                = $row1["email"];
  $fornavn              = $row1["fornavn"];
  $efternavn            = $row1["efternavn"];
  $name = $fornavn . $efternavn;
  $mail->AddAddress($address, $name);

  // Hvis hver modtager skal have sin egen udgave af Body, laves den her

  $mail->Send();
  $mail->ClearAddresses();
}
Avatar billede Slettet bruger
28. november 2005 - 14:27 #5
Mit gæt er, at du havde en linie med $mail->Send() efter løkken, og det vil så give en fejlmeddelelse, når adressen bliver slettet inde i løkken.
Avatar billede zac Nybegynder
28. november 2005 - 16:30 #6
Jeg kan godt se, det er lidt mystisk, men der er kun det her med, og det virker:

udenfor while løkken: require("class.phpmailer.php");   

indenfor:
$mail = new PHPMailer()
$mail->IsSMTP
$mail->Host
$mail->From
$mail->FromName
$mail->AddAddress
$mail->Subject
$mail->Body
$mail->IsHTML(true)
$mail->AltBody="";
$mail->WordWrap = 40;
if(!$mail->Send())
{
  echo "E-mailen er ikke sendt.";
  echo "Mailer Error: " . $mail->ErrorInfo;
}
else
{
  echo "OK--";
}

Der er ikke nogen $mail->Send()!? (Den sidste siger kun hvis ikke $mail->Send())

Den har jeg så tygget lidt på. Men det må vel være fordi Send skjuler sig her i funktionen Send:
            case "smtp":
                $result = $this->SmtpSend($header, $body);
                break;
(og $mail->IsSMTP, som er med, trækker på
function IsSMTP()
{
    $this->Mailer = "smtp";


Hvis det er sådan skruet sammen, er det lige før, jeg forstår det.
jakobdo har så givet den "generaliserede" udgave, som $mail->IsSMTP sætter ud af kraft!?
Avatar billede Slettet bruger
28. november 2005 - 16:55 #7
Fidusen er, at $mail->Send() returnerer en sand/falsk-værdi for om det lykkedes. I den if-sætning bliver $mail->Send() faktisk kaldt og samtidig bliver returværdien kontrolleret.

At kalde $mail->Send() uden at kontrollere er lidt dårlig skik og det ville være mere korrekt at bruge en if i stil med den anden. Her er et eksempel, du kan bruge:

if(!$mail->Send())
{
  echo "E-mailen er ikke sendt.";
  echo "Mailer Error: " . $mail->ErrorInfo;
}
else
{
  echo "Mail til $address blev sendt.<br>";
}
Avatar billede Slettet bruger
28. november 2005 - 16:58 #8
NB! Den if skal så erstatte den $mail->Send(), der var i forvejen.
Avatar billede zac Nybegynder
28. november 2005 - 23:54 #9
Hm, mystikken er ikke helt væk...

For det første: Der var ikke en $mail->Send() i forvejen (direkte), der var kun en $mail->IsSMTP

For det andet: Hvis jeg slår $mail->Send(); til, OG sætter
if(!$mail->Send())
{
  echo "E-mailen er ikke sendt.";
  echo "Mailer Error: " . $mail->ErrorInfo;
}
elseif($mail->Send())
{
  echo "Mail til $address blev sendt.<br>";
}
- så bliver der modtaget to mails på hver adresse.

For det tredie:
Hvis $mail->Send(); slås til, og der kun står "else", i.s.f. elseif($mail->Send()), modtages der kun en mail til hver adresse (men det ser ud som om der sendes to, som i pkunt 2!).
Hvordan kan den forskel komme?

For det fjerde: Hvis jeg slår $mail->ClearAddresses(); til, sendes der ikke (E-mailen er ikke sendt.Mailer Error: Language string failed to load: provide_address).
Avatar billede zac Nybegynder
28. november 2005 - 23:57 #10
og med "elseif($mail->Send())", og uden $mail->Send() bliver der også modtaget 2 emails på hver adresse!
Avatar billede zac Nybegynder
29. november 2005 - 00:01 #11
Så jeg bliver foreløbig ved:
...
$mail->Send();
// var ikke med i mine første forsøg og er åbenbart ikke nødvendig, men kun ønskelig
...
if(!$mail->Send())
{
  echo "E-mailen er ikke sendt.";
  echo "Mailer Error: " . $mail->ErrorInfo;
}
else
{
  echo "Mail til $address blev sendt.<br>";
}
Avatar billede Slettet bruger
29. november 2005 - 00:09 #12
Hver gang der står $mail->Send() vil den sende en mail - uanset om det står i en parentes ved if eller elseif eller for sig selv.

Og kaldet til $mail->ClearAddresses() skal ske efter mailen er sendt og før løkken er slut. Formålet er, at den første adresse skal fjernes igen, så andet gennemløb af løkken ikke sender til både nummer et og to. (Og tredje sender til 1, 2 og 3 - stakkels nummer 1 på listen ville få 100 mails, hvis der var 100 i databasen.)
Avatar billede zac Nybegynder
29. november 2005 - 00:40 #13
Yes, tak, det hjælper at sætte $mail->ClearAddresses() allersidst, dvs. efter kald til andre funktioner (alt, som begynder med $mail-> ()).

Men stadig (nu med $mail->ClearAddresses() til sidst i løkken):
Når $mail->Send() er sat til, kan man se, der sendes dobbelt antal e-mails (to til hver adresse), mens der kun modtages en på hver adresse.
Når $mail->Send() ikke er sat til, sendes der kun en til hver adresse...
Det forstår jeg ikke.
Avatar billede Slettet bruger
29. november 2005 - 00:41 #14
Prøv at vise os hele koden i stedet for blot udsnit. Så er det måske lidt lettere at spotte problemet.
Avatar billede zac Nybegynder
29. november 2005 - 23:25 #15
Jeg frafalder, har jo faktisk fået det til at virke - og skal lære ikke at forstå tingene helt til bunds, så tager det for lang tid!
Og giver gerne points - Det var sandbox' om at sætte require klassen op før løkken, som gav gennembruddet.
Avatar billede Slettet bruger
30. november 2005 - 00:18 #16
Jamen så lægger jeg da bare et svar.
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