Newsletter Mailversand - Performancefrage

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

  • Newsletter Mailversand - Performancefrage

    Moin,

    ich habe folgendes Problem:

    ich möchte an einen fest definierten Kreis einen Newsletter versenden.

    Hierfür habe ich mir zwei Möglichkeiten überlegt - weiss nun aber nicht, wie sich die beiden Versionen von der Performance auswirken.

    Version 1:

    PHP-Code:
    $headers['From'] = 'from@adresse.de';
    $headers['Subject'] = 'Newsletter';
    $headers['Bcc'] = $recipients;
    $headers['Content-Type'] = 'text/html';
    $body $nachricht;

    // Create the mail object using the Mail::factory method

    $mail_object =& Mail::factory('mail'$params);
    $mail_object->send('standart@empfaenger.de'$headers$body); 
    Version 2:

    Hier würde ich Anstelle der Mail mit BCC die Empfängerliste mit foreach durchlaufen lassen und jedem einzeln die Mail zustellen lassen...

    Von der Umsetzung ist das kein Problem, nur weiss ich nicht, wie sich die beiden Versionen bei Empfängerzahlen jenseits der 10.000 verhalten...
    Könnt Ihr mir da weiterhelfen, welches die Resourcenschonendere Version ist?

    MfG
    Jens

  • #2
    bei Empfängerzahlen jenseits der 10.000 verhalten
    also bei der zahl wirst du eh probleme bekommen, egal womit. timeouts, smtp-server macht dicht, spam-filter wird aktiv, usw. frag erst mal bei deinem provider nach, was der dazu sagt.

    gruß
    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Hi,

      ich hab die besten Erfahrungen damit gemacht die mails per Hand im 30-50er Pack an den Mailserver auszuliefern. Also fsockopen, HELO, 30 mails rauspullern, fclose, fsockopen, usw.

      Einzelne mail()-Statements würd ich lassen. mail() macht bei jeder Mail eine neue Verbindung zum Mailserver auf.

      BCC halte ich für problematisch, weil das afaik die menge der Adresse von Server zu Server unterschiedlich ist. Aus Spam-Schutz gründen sind da meistens nur 10 oder so zugelassen. Da lasse ich mich aber auch gerne korrigieren

      Kommentar


      • #4
        Hallo,

        generell kann ich dir dazu auf anhieb auch nicht helfen... da ich nicht auf Newsletter stehe. Aber du könntest dir selbst einen Benchmark basten. Hier eine gute Seite die dir bei der Erstellung hilft: http://benchmark.nophia.de/benchmarks.html

        Generell gehe ich aber davon aus das eine E-Mail mit vielen BCC schneller zu verschicken ist als viele einzelne ^^
        Zuletzt geändert von Bugbuster; 20.03.2007, 16:39.
        tutorial: peterkropff.de schattenbaum.de tut.php-quake.net
        documentation: php.net mysql.com framework.zend.com

        Die Nachtwache!

        Kommentar


        • #5
          Also, um den Provider mache ich mir im Moment keine Sorgen.

          Der Newsletter wird z.Z. per Hand erstellt und mit einem externen Programm über den Mailserver des Providers geschickt. Der Nachteil ist, daß der ganze Vorgang ewig lange dauert - vor allem das zusammenstellen per Hand.

          Daher soll hier halt ein automatisiertes Skript laufen.

          @prego
          kannst Du mir Deinen Ansatz nochmal näher erläutern?
          Ist für mich nämlich mehr oder weniger das erste mal, daß ich überhaupt mit php mails versenden will... zumindest im größeren Stil...

          Kommentar


          • #6
            PHP-Code:

            define
            ('MAIL_SMTP_SERVER''smtp.example.com');

            if(
            $smtp fsockopen(MAIL_SMTP_SERVER25)){
              
            $out fgets($smtp1024);  //SMTP-Server ausgabe lesen
              
            if (preg_match("/^220/"$out)) { //220 = ok
                
            fputs($smtp"HELO ".MAIL_SMTP_SERVER."\r\n"); //SMTP-Serber halo sagen
                
            $out fgets($smtp1024); //Rückgabe lesen

                
            $i 0;
                foreach(
            $arr_mails AS $mail){ //mails abarbeiten

                  //prüfen ob wir schon 30 Stück verschickt haben
                  //Wenn ja, neu zum SMTP verbinden
                  
            if($i%30 === 0){
                    
            fputs($smtp"QUIT");
                    
            fclose($smtp);
                    
            $smtp fsockopen(MAIL_SMTP_SERVER25);
                    
            $out fgets($smtp1024);
                    
            fputs($smtp"HELO ".MAIL_SMTP_SERVER."\r\n");
                    
            $out fgets($smtp1024);
                  }
                  
            $i++;

                  
            //Nachrichtenteile
                  
            $headers   'From: Absender <noreply@example.com>'"\n" .
                               
            'Reply-To: Absender <noreply@example.com>'"\n".
                               
            'Content-Type: text/plain; charset=ISO-8859-1'."\n".
                               
            'X-Mailer: PHP/' phpversion();
                  
            //Wenn HTML-Mail dann Content-Type: text/html

                  
            $to        $target_email//Email Adresse des Empfängers
                  
            $subject   quoted_printable_encode('ISO 8859-1 Betreff äöü');
                  
            $message  "Huhu, ich bin eine tolle Mail!!! äöü";      
                  
            //Hier entsprechend dem User die Mail zusammen bauen.
                  //im Idealfall das ganze vorher schon machen und in einem Array speichern
                  

                  
            fputs($smtp"MAIL FROM: Absender <noreply@example.com>\r\n"); //Envelope
                  
            $from fgets($smtp1024);

                  
            fputs($smtp"RCPT TO: <".$to."}>\r\n"); //Empfänger bekannt geben
                  
            $to_out fgets($smtp1024);

                  
            fputs($smtp"DATA\r\n"); //Mailser sagen, das wir Daten senden
                  
            $data fgets($smtp1024);

                  
            $msg 'To: '.$to."\n".$headers."\nSubject: ".$subject."\n".$message."\r\n\r\n";
                  
            //Mail zusammen bauen

                  
            fputs($smtp$msg); //der eigentliche Versand
                  
            $mail fgets($smtp1024);

                  if(!
            preg_match("/^250/"$mail)){
                    echo 
            "Fehler beim Versand (".$to.")<br/>";
                  }else{
                    echo 
            "Versandt an ".$to."<br/>";
                  }
                }
              
                
            fputs($smtp"QUIT"); //Mailserver Tschüss sagen
                
            fclose($smtp);  
              }
            }


            //Funktion zum encoden eines ISO-8859-1 Betreffs in 7-bit-MIME
            function quoted_printable_encode$sString$charset 'iso-8859-1' ) {
              
            $aMatch = array();
              if(
            preg_match('/[^\x21-\x3C\x3E-\x7E\x09\x20]/e'$sString)){
                
            $sString preg_replace'/[^\x21-\x3C\x3E-\x7E\x09\x20]/e'
                                
            'strtoupper(sprintf( "=%02x", ord ( "$0" ) )) ;',  $sString );
                
            preg_match_all'/.{1,73}([^=]{0,3})?/'$sString$aMatch );
                return 
            '=?'.$charset.'?Q?'.str_replace(' ''_'implode'=' CR$aMatch[0])).'?=';
              }else{
                return 
            $sString;
              }


            Das ist im groben das was ich einsetze. Die Kommentare sollten dir zeigen wies funktioniert...

            PS: Das Script würde so nicht funktionieren. Ist ziemlich aus meiner Live Anwendung rausgerissen und nur entsprechend gesäubert.
            Musst natürlich den $to aus den $arr_mails holen - wie eben auch die $message, etc.
            Zuletzt geändert von prego; 20.03.2007, 19:02.

            Kommentar


            • #7
              @prego bzw. @all

              Mit bis zu wie vielen Empfängern wird deine Lösung eingesetzt?

              Ein Kunde hat eben angefragt und möchte an ca. 25.000 Empfänger einen Newsletter rauslassen.

              Wenn ich da so drüber nachdenke, könnten bei 25.000 locker ca. 5.000 dabei sein die z.B. eine @t-online.de Adresse haben oder halt auch viele die bei AOL und diversen Providern ne Mailadresse haben.

              Was ich mich frage: Wenn jetzt grob geschätzt innerhalb von 6 - 12 Stunden da eben bei 5.000 t-online Adressen Mails von der gleichen Maschine ankommen (und nehmen wir mal an diese Mails sind nicht personalisiert - also 100% alle identischen Inhalt haben) dann dürfte da doch die Gefahr recht hoch sein, dass t-online (oder eben AOL und Konsorten) die Absender-Adresse oder gar die ganze Maschine komplett blockt, oder bin ich da zu pessimistisch?

              Wäre natürlich übel falls da wegen sowas dann die komplette IP des entsprechenden Serves geblockt würde, da wir natürlich mehrere Kunden auf der gleichen Maschine hosten.

              Bin auch kein Freund von Newslettern aber in letzter Zeit fragen vermehrt Kunden nach einer Lösung dafür an, sodass wir da wohl doch mal was bereitstellen müssen (und natürlich wollen alle html-Mails senden ).

              Deshalb würde mich generell interessieren wie die Gefahr einzuschätzen ist, dass man geblockt wird und wie man ggf. "vorbeugen" könnte (nur-Text-Mails, verzögertes und Paketweises versenden usw.).
              Ihr habt ein Torturial durchgearbeitet, das auf den mysql_-Funktionen aufbaut?
              Schön - etwas Geschichte kann ja nicht schaden.
              Aber jetzt seht euch bitte php.net/pdo oder php.net/mysqli bevor ihr beginnt!

              Kommentar


              • #8
                die Absender-Adresse oder gar die ganze Maschine komplett blockt, oder bin ich da zu pessimistisch?
                Naja, geh mal davon aus das bei anderen Newsletter Anbietern ähnlich viele Newsletter an den gleichen Provider gehen. Du kannst ja die Adressen nach Absender Name sortieren dann werden die Mails in unterschiedlichen Abständen verschickt. Im Zweifelsfall einfach mal frech bei T-Online & Co nachfragen.
                Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                Kommentar


                • #9
                  Re: Newsletter Mailversand - Performancefrage

                  Original geschrieben von jhartlep


                  Von der Umsetzung ist das kein Problem, nur weiss ich nicht, wie sich die beiden Versionen bei Empfängerzahlen jenseits der 10.000 verhalten...
                  Bei mir sind die Newsletter Geschichten schon etwas her aber "damals" konnte ich ohne Problem 15000 mails/sek schicken. Provider blocken nur wenn die mails an die gleiche Adresse geschickt werden. Also 10000mails an eine Adresse. Domains sind davon eigentlich nicht betroffen.
                  Zuletzt geändert von xkl1986; 18.07.2007, 15:13.
                  "Nicht jeder Mensch kann und soll Programmieren[...]".

                  Kommentar


                  • #10
                    Na ja, wenn man sich mal das Angebot von eleven.de ansieht, dann ist doch eigentlich klar, dass in Nahe Zukunft Massenemailversendungen nicht mehr durchkommen. Es sei denn man unterteilt diese, wie bereits erwähnt, in einzelne Pakete sortiert nach der Empfängerdomain.
                    » http://www.htaccess-generator.com

                    Kommentar


                    • #11
                      Original geschrieben von prego
                      Einzelne mail()-Statements würd ich lassen. mail() macht bei jeder Mail eine neue Verbindung zum Mailserver auf.
                      Wir versenden auf einem Server einmal im Monat 50.000 Mails mit dieser Variante - funktioniert.

                      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                      Wie man Fragen richtig stellt

                      Kommentar


                      • #12
                        Es gibt da so tolle Anbieter ( A***r.de) an die man ohne ein Problem 10000 Mail an die gleiche Adresse in 1 sek schicken kann.

                        Mal ausprobiert, script mit der mail() funktion, nach 3 sek laufzeit waren auf einmal 35000 Mail in dem Postfach ^^.

                        Super Spamschutz sag ich da
                        "Nicht jeder Mensch kann und soll Programmieren[...]".

                        Kommentar


                        • #13
                          da ich gerad an dem gleichen thema sitze, habe ich eine weitergehende frage.
                          wie handelt ihr dass bouncemanagement?
                          es ist ja immerhin wichtig zu wissen, wieviel meine mail nicht bekommen haben und z. b. warum nicht (mailbox voll, spamabwehr, mailbox gelöscht...)

                          Kommentar


                          • #14
                            Mein Postmaster Account übergibt Mails einem Vorfilter, der entscheidet ob es ein Bounce auf den Newsletter ist. Trifft das zu, wird die Mail in ein bestimmtes Verzeichnis gelegt.

                            Über dieses Verzeichnis geht jeden Tag ein durch Cron getriggertes Script, dass jede Datei liest und abhängig von den Ergebnissen der Analyse entsprechende Updates auf der DB der Newsletterabonnenten macht.

                            Kommentar


                            • #15
                              probleme mit mailversand

                              hi, ich habe jetzt obriges script ausprobier

                              PHP-Code:
                              $smtp_server="smtp.domain.de";
                              $username="user@domain.de";
                              $password="letMeIn";
                              define('MAIL_SMTP_SERVER'$smtp_server);
                              if(
                              $smtp fsockopen(MAIL_SMTP_SERVER25)){
                                
                              $out fgets($smtp1024);  //SMTP-Server ausgabe lesen
                                
                              if (preg_match("/^220/"$out)) { //220 = ok
                                  
                              fputs($smtp"HELO ".MAIL_SMTP_SERVER."\r\n"); //SMTP-Serber halo sagen
                                  
                              $out fgets($smtp1024); //Rückgabe lesen

                                  
                              fputs($smtp"QUIT");
                                  
                              fclose($smtp);
                                  
                              $smtp fsockopen(MAIL_SMTP_SERVER25);
                                  
                              $out fgets($smtp1024);
                                  
                              fputs($smtp"HELO ".MAIL_SMTP_SERVER."\r\n");
                                  
                              $out fgets($smtp1024);
                                
                              // SMTP authorization
                                
                              fputs($smtp"AUTH LOGIN\n");
                                
                              fputs($smtpbase64_encode($username)."\n");
                                
                              fputs($smtpbase64_encode($password)."\n");


                                      
                              $headers 'From: Absender [email]absender@domain.de[/email]\n' .
                                             
                              'Reply-To: Absender <absender@domain.de>\n'.
                                             
                              'Content-Type: text/plain; charset=ISO-8859-1'."\n".
                                             
                              'X-Mailer: PHP/' phpversion();
                                                           
                                      
                              $mailTo "empfaenger@domainZwei.de"//Email Adresse des Empfängers ($target_email)
                                  
                              $subject   quoted_printable_encode("Moin Du"); //$maiSubject=Betreff der Mail
                                  
                              $message  =  "jetzt habe ich mir doch tatsächlich eine Mail gesendet :)";  //$mailText=Inhalt der Mail  
                                      
                              fputs($smtp"MAIL FROM: Absender <absender@domain.de>\r\n"); //Envelope
                                  
                              $from fgets($smtp1024);

                                  
                              fputs($smtp"RCPT TO: <".$mailTo."}>\r\n"); //Empfänger bekannt geben
                                  
                              $to_out fgets($smtp1024);

                                  
                              fputs($smtp"DATA\r\n"); //Mailser sagen, das wir Daten senden
                                  
                              $data fgets($smtp1024);

                                  
                              $msg 'To: '.$mailTo."\n".$headers."\nSubject: ".$subject."\n".$message."\r\n\r\n";
                                  
                              //Mail zusammen bauen

                                  
                              fputs($smtp$msg); //der eigentliche Versand
                                  
                              $mail fgets($smtp1024);
                                  echo 
                              "out:".$mail."<br />";

                                  if(!
                              preg_match("/^250/"$mail)){
                                    echo 
                              "<span style=\"color:#f00;font-weight: bold;\">!!!Fehler beim Versand (".$mailTo.")!!!</span><br/>";
                                  }else{
                                    echo 
                              "Versendet an ".$mailTo."<br/>";
                                  }
                                  
                                
                                  
                              fputs($smtp"QUIT"); //Mailserver Tschüss sagen
                                  
                              fclose($smtp);
                                  }

                              Soweit so gut.
                              Es passiert folgendes:
                              Code:
                              out:250 is syntactically correct 
                              Versendet an [email]empfaenger@domainZwei.de[/email]
                              Aber ankommen tuts nicht ( Habe 2 existierende Mailaccounts getestet, beide negativ. Sagt mir das versendet, aber nix passiert (
                              Any ideas?

                              Kommentar

                              Lädt...
                              X