Ankündigung

Einklappen
Keine Ankündigung bisher.

phpmailer an mehrere Adressen gleichzeitig

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • phpmailer an mehrere Adressen gleichzeitig

    http://phpmailer.sourceforge.net geht als einzelnes Mail bestens, doch ich möchte mehrere Adressen aus der DB gleichzeitig bemailen (Newsletter)

    Die Datensätze sind vorhanden, aber es geht nur ein Mail raus! Was mache ich falsch?


    PHP-Code:
    require("phpmailer/class.phpmailer.php"); 
    //Adressen holen 
    $query "select Mail from testmitglieder"
    $result mysql_query($query,$link); 
    $num mysql_num_rows($result); 
    for (
    $i 0$i $num$i++) 

    //Start Schleife 
    $row mysql_fetch_array($result); 
    $mail = new PHPMailer(); 
    $mail->From "info@xxxx"
    $mail->FromName "xxxxxx"
    $mail->AddAddress("$row[Mail]"); 
    $mail->AddReplyTo("info@xxxx"); 
    $mail->WordWrap 50;  
    // wenn 1 PDF 
    if(!empty($dateifilea) and empty($dateifileb)) 

    copy ($dateifilea,"../pdf/$dateiname"); 
    $mail->AddAttachment("../pdf/$dateiname");  

    // wenn 2 PDF 
    if(!empty($dateifilea) and !empty($dateifileb)) 

    copy ($dateifilea,"../pdf/$dateiname"); 
    copy ($dateifileb,"../pdf/$dateiname2"); 
    $mail->AddAttachment("../pdf/$dateiname"); $mail->AddAttachment("../pdf/$dateiname2");  

    //Mail 
    $mail->IsHTML(true);                                 
    $mail->Subject "$betreff"
    $mail->Body    "$MESSAGEHTML"
    $mail->AltBody "$messageplain"
    // Schluss Schleife 

    //Wenn Mail nicht geschickt 
    if(!$mail->Send()) 

       echo 
    "<h3>Das Mail konnte nicht verschickt werden. "
       echo 
    "Mailer Fehler: " $mail->ErrorInfo
       echo 
    "</h3>"
       exit; 

    echo 
    "<h3>Das Mail ist abgeschickt.</h3>"
    ?> 

  • #2
    1.
    $mail->AddAddress("$row[Mail]");
    --> $mail->AddAddress($row['Mail']);

    2.
    PHP-Code:
    <?php
    if(!$mail->Send()) // HIER wird die E-Mail geschickt, die Schleife ist aber schon beendet -> FOLGE: Nur eine E-Mail wird verschickt (an die zuletzt genommene E-Mail Adresse)

       echo 
    "<h3>Das Mail konnte nicht verschickt werden. "
       echo 
    "Mailer Fehler: " $mail->ErrorInfo
       echo 
    "</h3>"
       exit; 

    echo 
    "<h3>Das Mail ist abgeschickt.</h3>"
     
    ?>
    musst du in die Schleife, da er sonst nur 1 abschicken soll (er macht das was du ihm sagst )

    MFG

    Kommentar


    • #3
      Danke, aber es geht nicht!

      Ist diese Klammer nicht da wenn es keinen Verand gab?

      if(!$mail->Send())
      {
      echo "<h3>Das Mail konnte nicht verschickt werden. ";
      echo "Mailer Fehler: " . $mail->ErrorInfo;
      echo "</h3>";
      exit;
      }


      ich lese dass wenn $ mail nicht ausgeführt wurde, dann kommt die Fehlermeldung

      Habe mal exit; deaktiviert, aber auch das hilft nicht! auch $mail->Send();
      alleine bringt nichts. $num gibt die richtige Anzahl Datensätze aus, die sollten also da sein! Doch die Schleife geht nicht! und wenn ich statt einmal require("phpmailer/class.phpmailer.php");
      //Adressen holen
      mache, sondern in der Schleife ein include, es kommt immer nur ein Mail!!

      Kommentar


      • #4
        Wenn du deinen Käse mal ordentlich einrücken würdest, dann würde dir auffallen, warum nur eine Mail rausgeht.
        PHP-Code:
        <?
          require("phpmailer/class.phpmailer.php");  
          
          //Adressen holen  
          $query = "select Mail from testmitglieder";  
          $result = mysql_query($query,$link);  
          $num = mysql_num_rows($result);  
          
          for ($i = 0; $i < $num; $i++)  
          {  
             //Start Schleife  
             $row = mysql_fetch_array($result);  
             $mail = new PHPMailer();  
             $mail->From = "info@xxxx";  
             $mail->FromName = "xxxxxx";  
             $mail->AddAddress("$row[Mail]");  
             $mail->AddReplyTo("info@xxxx");  
             $mail->WordWrap = 50;
             
             // wenn 1 PDF  
             if(!empty($dateifilea) and empty($dateifileb))  
             {  
                copy ($dateifilea,"../pdf/$dateiname");  
                $mail->AddAttachment("../pdf/$dateiname");   
             }  
             
             // wenn 2 PDF  
             if(!empty($dateifilea) and !empty($dateifileb))  
             {  
                copy ($dateifilea,"../pdf/$dateiname");  
                copy ($dateifileb,"../pdf/$dateiname2");  
                $mail->AddAttachment("../pdf/$dateiname"); $mail->AddAttachment("../pdf/$dateiname2");   
             }  
             
             //Mail  
             $mail->IsHTML(true);                                  
             $mail->Subject = "$betreff";  
             $mail->Body    = "$MESSAGEHTML";  
             $mail->AltBody = "$messageplain";  
             // Schluss Schleife  
          }  
          
          //Wenn Mail nicht geschickt  
          if(!$mail->Send())  
          {  
             echo "<h3>Das Mail konnte nicht verschickt werden. ";  
             echo "Mailer Fehler: " . $mail->ErrorInfo;  
             echo "</h3>";  
             exit;  
          }  
          
          echo "<h3>Das Mail ist abgeschickt.</h3>";  
        ?>
        Da du in der Schleife jedes mal ein neues Object anlegst, bleibt am guten Schluss der Schleife genau die letzte EMail-Adresse in der DB über.

        Alles was mit dem phpMailer zu tun hat, gehört vor die Schleife. Nur die Zeile

        PHP-Code:
        $mail->AddAddress("$row[Mail]"); 
        bleibt darin.
        PHP-Code:
        <?
          require("phpmailer/class.phpmailer.php");  
          
          //Adressen holen  
          $query = "select Mail from testmitglieder";  
          $result = mysql_query($query,$link);  
          $num = mysql_num_rows($result);  
          
          $mail = new PHPMailer();  
          $mail->From = "info@xxxx";  
          $mail->FromName = "xxxxxx";  
          $mail->AddReplyTo("info@xxxx");  
          $mail->WordWrap = 50;
             
          // wenn 1 PDF  
          if(!empty($dateifilea) and empty($dateifileb))  
          {  
             copy ($dateifilea,"../pdf/$dateiname");  
             $mail->AddAttachment("../pdf/$dateiname");   
          }  
             
          // wenn 2 PDF  
          if(!empty($dateifilea) and !empty($dateifileb))  
          {  
             copy ($dateifilea,"../pdf/$dateiname");  
             copy ($dateifileb,"../pdf/$dateiname2");  
             $mail->AddAttachment("../pdf/$dateiname"); $mail->AddAttachment("../pdf/$dateiname2");   
          }  
             
          //Mail  
          $mail->IsHTML(true);                                  
          $mail->Subject = "$betreff";  
          $mail->Body    = "$MESSAGEHTML";  
          $mail->AltBody = "$messageplain";    
          
          for ($i = 0; $i < $num; $i++)  
          {  
             //Start Schleife  
             $row = mysql_fetch_array($result);  
             $mail->AddAddress("$row[Mail]");  
             // Schluss Schleife  
          }  
          
          //Wenn Mail nicht geschickt  
          if(!$mail->Send())  
          {  
             echo "<h3>Das Mail konnte nicht verschickt werden. ";  
             echo "Mailer Fehler: " . $mail->ErrorInfo;  
             echo "</h3>";  
             exit;  
          }  
          
          echo "<h3>Das Mail ist abgeschickt.</h3>";  
        ?>
        Ich würde mir aber noch überlegen, ob ich nicht lieber BCC nehmen würde.

        Gruß
        phpfan

        Kommentar


        • #5
          Danke

          Jetzt geht das Maiul an alle Adressaten, aber in Feld an kommen alle Empfänger. Und das will ich natürlich nicht!

          Ich wollte eigentlich einzelne Mails generieren, so dass niemend siht wer das Mail sonst auch noch bekommen hat, und doch nicht per BCC, denn diese gehen zum Teil ja auch direkt in den Spam-Ordner.

          Ich wollte die Schleife nicht bei der Adresse machen, sondern beim Mail, so dass das System eine entsprechend EAnzahl Mails generiert. Von der Performance her sollte es kein Problem sein.

          Gruss und eine interessante Nacht
          Sonja

          Kommentar


          • #6
            Probiers mal so (mailversand mit in die Schleife) -->



            PHP-Code:
            <?php
              
            require("phpmailer/class.phpmailer.php"); 
              
            //Adressen holen 
              
            $query "select Mail from testmitglieder"
              
            $result mysql_query($query,$link); 
              
            $num mysql_num_rows($result); 

              
            // START Schleife 
              
            for ($i 0$i $num$i++) { 
                
            $row mysql_fetch_array($result); 
                
            $mail = new PHPMailer(); 
                
            $mail->From "info@xxxx"
                
            $mail->FromName "xxxxxx"
                
            $mail->AddReplyTo("info@xxxx"); 
                
            $mail->AddAddress($row['Mail']); 
                
            $mail->WordWrap 50
                
            // PDF 1
                
            if(!empty($dateifilea) and empty($dateifileb)) { 
                  
            copy ($dateifilea,"../pdf/$dateiname"); 
                  
            $mail->AddAttachment("../pdf/$dateiname");  
                } 
                
            // PDF 2
                
            if(!empty($dateifilea) and !empty($dateifileb)) { 
                  
            copy ($dateifilea,"../pdf/$dateiname"); 
                  
            copy ($dateifileb,"../pdf/$dateiname2"); 
                  
            $mail->AddAttachment("../pdf/$dateiname"); $mail->AddAttachment("../pdf/$dateiname2");  
                } 
                
            //Mail 
                
            $mail->IsHTML(true);                                 
                
            $mail->Subject "$betreff"
                
            $mail->Body    "$MESSAGEHTML"
                
            $mail->AltBody "$messageplain"
                if(!
            $mail->Send()) { 
                  echo 
            "<h3>Die E-Mail konnte nicht an [i]"$row['Mail'] ."[/i] verschickt werden. "
                  echo 
            "  Mailer Fehler: "$mail->ErrorInfo
                  echo 
            "</h3>"
                  exit; 
                } else {
                  echo 
            "<h3>Die E-Mail wurde abgeschickt.</h3>";  
                }
              } 
              
            // ENDE Schleife

            ?>

            Kommentar


            • #7
              @HK
              Sorry, das ist so Quatsch. In der Schleife wird jedes mal ein neues Object angelegt und immer wieder Variablen gesetzt, wozu? Da Sonja zu diesem Thema noch einen Thread (unverständlicherweiser) eröffnet hat, habe ich hier weitergemacht: http://www.phpfriend.de/forum/ftopic49826.html

              Gruß
              phpfan

              Kommentar


              • #8
                http://www.phpfriend.de/forum/viewtopic.php?p=344185

                Sorry, ich weiss nicht weshalb, vermutlich war es mein nervöser Finger

                Kommentar


                • #9
                  Die Lösung von HK geht, nur musste ich noch die Bestätigung rausnehmen.

                  PHP-Code:
                  <?php
                  <?php 
                    
                  require("phpmailer/class.phpmailer.php");  
                    
                  //Adressen holen  
                    
                  $query "select Mail from testmitglieder";  
                    
                  $result mysql_query($query,$link);  
                    
                  $num mysql_num_rows($result);  

                    
                  // START Schleife  
                    
                  for ($i 0$i $num$i++) {  
                      
                  $row mysql_fetch_array($result);  
                      
                  $mail = new PHPMailer();  
                      
                  $mail->From "info@xxxx";  
                      
                  $mail->FromName "xxxxxx";  
                      
                  $mail->AddReplyTo("info@xxxx");  
                      
                  $mail->AddAddress($row['Mail']);  
                      
                  $mail->WordWrap 50;  
                      
                  // PDF 1 
                      
                  if(!empty($dateifilea) and empty($dateifileb)) {  
                        
                  copy ($dateifilea,"../pdf/$dateiname");  
                        
                  $mail->AddAttachment("../pdf/$dateiname");   
                      }  
                      
                  // PDF 2 
                      
                  if(!empty($dateifilea) and !empty($dateifileb)) {  
                        
                  copy ($dateifilea,"../pdf/$dateiname");  
                        
                  copy ($dateifileb,"../pdf/$dateiname2");  
                        
                  $mail->AddAttachment("../pdf/$dateiname"); $mail->AddAttachment("../pdf/$dateiname2");   
                      }  
                      
                  //Mail  
                      
                  $mail->IsHTML(true);                                  
                      
                  $mail->Subject "$betreff";  
                      
                  $mail->Body    "$MESSAGEHTML";  
                      
                  $mail->AltBody "$messageplain";  
                      if(!
                  $mail->Send()) {  
                        echo 
                  "<h3>Die E-Mail konnte nicht an [i]"$row['Mail'] ."[/i] verschickt werden. ";  
                        echo 
                  "  Mailer Fehler: "$mail->ErrorInfo;  
                        echo 
                  "</h3>";  
                        exit;  
                      } 
                    }  
                   echo 
                  "<h3>Die E-Mail wurde abgeschickt.</h3>";   

                    
                  // ENDE Schleife 

                  ?>
                  ?>
                  Wenn ich die Bestätigung nach dem if im else drin habe kommen soviele Bestätigungen wie Mails rausgingen. und da es schulssendlich an die 200 Mail sein werden, käme 200x der Text.

                  Danke allen für die Hilfe und nochmals sorry wegen den 2 Einträgen

                  Kommentar


                  • #10
                    Stimmt, aber ich glaube die Lösung ist nicht so schön weil die gleich bleibenden Variablen unnütz in der schleife sind. DIe müsste man vor die schleife schreiben aber dann passt es mit $mail = new PHPMailer(); nicht mehr ... kein plan und zeit dies zu testen

                    vielleicht auf phpfans antwort warten ich bin schließlich auch noch Anfänger

                    Kommentar


                    • #11
                      Zitat von HK
                      vielleicht auf phpfans antwort warten ich bin schließlich auch noch Anfänger
                      Wieso warten, ich habe schon alles dazu geschrieben!

                      Weder $mail = new PHPMailer(); noch die Zeilen mit $mail->.... gehören in die Schleife. Das Kopieren wird auch in der Schleife gemacht, was soll der Quatsch. Nochmal, in die Schleife gehört nur mail->AddAddress($row['Mail']); , if(!$mail->Send()) { und danach noch ein ClearAddresses. Alles andere ist doppelt gemoppelt, verbraucht unnötig Speicher und macht die Sache langsamer.

                      Gruß
                      phpfan

                      Kommentar


                      • #12
                        da hab ich mal ne Frage. Möcht mich schliesslich auch weiterbilden

                        ist es so wie ich es jetzt schreibe auch möglich oder ist da was falsch bzw / unsinnig? Weil eigentlich ist ja in dem Code von Sonja mysql_num_rows und die for schleife nicht so gut. Mit while gehts doch einfacher oder?

                        Hät das so gemacht:

                        PHP-Code:
                        <?php
                          
                        require 'phpmailer/class.phpmailer.php';  

                          
                        //Adressen holen  
                          
                        $query "select Mail from testmitglieder";  
                          
                        $result mysql_query($query,$link);  

                          
                        //Mail  
                          
                        $mail = new PHPMailer();  
                          
                        $mail->From "info@xxxx";  
                          
                        $mail->FromName "xxxxxx";  
                          
                        $mail->AddReplyTo("info@xxxx");  
                          
                        $mail->WordWrap 50;  
                          
                        $mail->IsHTML(true);                                  
                          
                        $mail->Subject "$betreff";  
                          
                        $mail->Body    "$MESSAGEHTML";  
                          
                        $mail->AltBody "$messageplain"

                          
                        // PDF 1 
                          
                        if(!empty($dateifilea) and empty($dateifileb)) {  
                            
                        copy ($dateifilea,"../pdf/$dateiname");  
                            
                        $mail->AddAttachment("../pdf/$dateiname");   
                          }  

                          
                        // PDF 2 
                          
                        if(!empty($dateifilea) and !empty($dateifileb)) {  
                            
                        copy ($dateifilea,"../pdf/$dateiname");  
                            
                        copy ($dateifileb,"../pdf/$dateiname2");  
                            
                        $mail->AddAttachment("../pdf/$dateiname"); $mail->AddAttachment("../pdf/$dateiname2");   
                          }   

                          
                        // START Schleife  
                          
                        while($row mysql_fetch_array($result)) {  
                            
                        $mail->AddAddress($row['Mail']);  
                            if(!
                        $mail->Send()) {  
                              echo 
                        "<h3>Die E-Mail konnte nicht an [i]"$row['Mail'] ."[/i] verschickt werden. ";  
                              echo 
                        "  Mailer Fehler: "$mail->ErrorInfo;  
                              echo 
                        "</h3>";  
                            } 
                            
                        $mail->ClearAddresses(); // Editiert
                          

                          
                        // ENDE Schleife  

                          
                        echo "<h3>Die E-Mails wurden verschickt.</h3>";   

                        ?>
                        // EDIT: Habs geändert

                        Kommentar


                        • #13
                          Fast alles richtig. Allerdings hat du kein ClearAddresses in der Schleife. Wenn du, sagen wir mal, 5 Adressen in der DB hast, bekommt der Erste in der Liste die Mail 5x, der Zweite 4x, etc.

                          Gruß
                          phpfan

                          Kommentar

                          Lädt...
                          X