Avatar billede agora_live Nybegynder
24. april 2012 - 21:22 Der er 7 kommentarer og
1 løsning

PHPMailer -> flere modtagere i Array FRA sql

Jeg har i dag et script som jeg har modificeret således at det så udemærket sender mail's til dem som jeg har manuelt skrevet i ind, men hvordan inkluderer jeg automatisk flere modtagere således at Array bliver trukket direkte fra en DB?

<?php
    include "class.smtp.php";
    include "class.phpmailer.php";

    $Host = "mail.yourdomain.com";                        // SMTP servers
    $Username = "your-smtp-username@yourdomain.com";    // SMTP password
    $Password = "your-smtp-password";                    // SMTP username

    $From = "from-email@yourdomain.com";
    $FromName = "From Name";

    $Tos = array(
        "To Name 1" => "to-email-1@4rapiddev.com",
        "To Name 2" => "to-email-2@gmail.com"
    );   
    $Ccs = array(
        "CC Name 1" => "cc-email-1@yahoo.com",
        "CC Name 2" => "cc-email-2@gmail.com"
    );

    $Subject = "Hello there";
    $Body = "This is a test email which will send to multiple recipients";

    $mail = new PHPMailer();

    $mail->IsSMTP();                    // send via SMTP
    $mail->Host    = $Host;
    $mail->SMTPAuth = true;            // turn on SMTP authentication
    $mail->Username = $Username; 
    $mail->Password = $Password;

    $mail->From    = $From;
    $mail->FromName = $FromName;
    foreach($Tos as $key => $val){
        $mail->AddAddress($val , $key);
    }

    foreach($Ccs as $key => $val){
        $mail->AddCC($val , $key);
    }

    $mail->WordWrap = 50;                // set word wrap
    $mail->Priority = 1;
    $mail->IsHTML(true); 
    $mail->Subject  =  $Subject;
    $mail->Body    =  $Body;
    if(!$mail->Send())
    {
        echo "Mailer Error: " . $mail->ErrorInfo;
    }
    else
    {
        echo 'Message has been sent.';
    }
?>

Ovenstående er "blot" en standard metode for at sende SMTP mail via php, men hvordan smider jeg et DB Array ind i det?
Avatar billede mrlaukamp Nybegynder
24. april 2012 - 21:34 #1
ved ikke lige med den måde, du gør det på. Jeg plejer at bruge PHPs egen indbyggede mail() funktion.

Men jeg tror jeg ville sætte alt mellem $tos og if(!$mail->send())
i en stor while lykke, hvis du forstår hvad jeg mener.

ellers:

<?php
    include "class.smtp.php";
    include "class.phpmailer.php";

    $Host = "mail.yourdomain.com";                        // SMTP servers
    $Username = "your-smtp-username@yourdomain.com";    // SMTP password
    $Password = "your-smtp-password";                    // SMTP username

    $From = "from-email@yourdomain.com";
    $FromName = "From Name";
    $Query = 'SELECT mail FROM table';
    $result = mysql_query($Query);
    while($row = mysql_fetch_assoc($result)){
    $Tos = $row['mail'];
    $Ccs = $row['mail'];

    $Subject = "Hello there";
    $Body = "This is a test email which will send to multiple recipients";

    $mail = new PHPMailer();

    $mail->IsSMTP();                    // send via SMTP
    $mail->Host    = $Host;
    $mail->SMTPAuth = true;            // turn on SMTP authentication
    $mail->Username = $Username; 
    $mail->Password = $Password;

    $mail->From    = $From;
    $mail->FromName = $FromName;
    foreach($Tos as $key => $val){
        $mail->AddAddress($val , $key);
    }

    foreach($Ccs as $key => $val){
        $mail->AddCC($val , $key);
    }

    $mail->WordWrap = 50;                // set word wrap
    $mail->Priority = 1;
    $mail->IsHTML(true); 
    $mail->Subject  =  $Subject;
    $mail->Body    =  $Body;
    if(!$mail->Send())
    {
        echo "Mailer Error: " . $mail->ErrorInfo;
    }
    else
    {
        echo 'Message has been sent.';
    }

} // luk while lykke
?>
Avatar billede agora_live Nybegynder
24. april 2012 - 21:41 #2
Er det ikke en meget resource krævende metode? Jeg tænker hvis jeg skal trække 500+ adresser fra en db, men sådan en "kæmpe" while?

Men jeg vil da lige prøve...
Avatar billede agora_live Nybegynder
24. april 2012 - 21:50 #3
Det eneste der skal ændres er modtagerne, derfor syntes jeg det "underligt" at lave så mange efterfølgende connections med login og det hele...

Jeg tænkte nærmere noget i stil med blot at tilføje ekstra modtagere via noget Foreach (altså trække adresser udfra db og dumpe en array kun ved $mail->AddAddress lokationen?

Er det ikke muligt?
Avatar billede mrlaukamp Nybegynder
24. april 2012 - 22:18 #4
Jeg ved ikke hvordan den Mailer class du bruger virker, men hvis du bruger PHPs egen mail(), så kan du sagtens tilføje flere modtagerer på en gang. Men som sagt, ved ikke om den class du bruger kan bruge arrays
Avatar billede agora_live Nybegynder
24. april 2012 - 22:27 #5
Det er PHPmailer som er sat til at bruge Gmail som afsender... Original script uden mods er:


<?php

// example on using PHPMailer with GMAIL

include("class.phpmailer.php");
include("class.smtp.php"); // note, this is optional - gets called from main class if not already loaded

$mail            = new PHPMailer();

$body            = $mail->getFile('contents.html');
$body            = eregi_replace("[\]",'',$body);

$mail->IsSMTP();
$mail->SMTPAuth  = true;                  // enable SMTP authentication
$mail->SMTPSecure = "ssl";                // sets the prefix to the servier
$mail->Host      = "smtp.gmail.com";      // sets GMAIL as the SMTP server
$mail->Port      = 465;                  // set the SMTP port

$mail->Username  = "yourname@gmail.com";  // GMAIL username
$mail->Password  = "password";            // GMAIL password

$mail->From      = "replyto@yourdomain.com";
$mail->FromName  = "Webmaster";
$mail->Subject    = "This is the subject";
$mail->AltBody    = "This is the body when user views in plain text format"; //Text Body
$mail->WordWrap  = 50; // set word wrap

$mail->MsgHTML($body);

$mail->AddReplyTo("replyto@yourdomain.com","Webmaster");

$mail->AddAddress("username@domain.com","First Last");

$mail->IsHTML(true); // send as HTML

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message has been sent";
}

?>


Og en "løsning" som du også foreslår som jeg har fundet på nettet er:

require("PHPMailer_v5.1 2/class.phpmailer.php");
while ($row = mysqli_fetch_array($result)){
    $to = $row['email'];
    $first_name = $row['first_name'];
    $last_name = $row['last_name'];
    $msg = "Dear $first_name $last_name,\n$text";

    $mailer = new PHPMailer();
    $mailer->IsSMTP();
    $mailer->Host = 'ssl://smtp.gmail.com:465';
    $mailer->SMTPAuth = TRUE;
    $mailer->Username = 'myemail@gmail.com';  // Sender's gmail address
    $mailer->Password = 'the_password';  // Sender's gmail password
    $mailer->From = "$from";  // Sender's email address
    $mailer->FromName = "$from_name"; // senders name
    $mailer->Body = "$msg";
    $mailer->Subject = "$subject";
    $mailer->AddAddress("$to");  // Recipient
    if(!$mailer->Send())
    {
        echo 'Email sent to:' . $to . '<br/ >';
        echo "Mailer Error: " . $mailer->ErrorInfo;
    }
    else
    {
        echo 'Email sent to:' . $to . '<br/ >';
    }


// Then close your while loop here
}

mysqli_close($dbc);


Men igen, er det ikke en meget omstændig måde at sende til flere modtagere på? Giver det ikke problemer med Gmail og MASS sendings problemer?
Avatar billede mrlaukamp Nybegynder
24. april 2012 - 22:31 #6
tror jeg ikke, det er jo sådan set kun en mail ad gangen den sender.
Den sender først den næste når den forrige er færdig :)
Avatar billede agora_live Nybegynder
25. april 2012 - 19:26 #7
Altså det fungere... Den sender til alle som jeg smider i db, så mrlaukamp smid lige et svar :-)
Avatar billede mrlaukamp Nybegynder
25. april 2012 - 19:38 #8
Et styks svar :D
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