Email verschicken

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

  • Email verschicken

    Hallo, ich habe wieder einmal ein Problem. Ich habe in einem Forum ein Mailversand eingebaut. Dieser soll Mails an Personen verschicken wenn ein neues Thema oder ein neuer Beitrag erstellt worden ist. Es funtkioniert auch, ABER:

    1. Wenn man ein Beitrag erstellt und auf den Button (Beitragerstellen) klickt, dauert es ziemlich lange bis der Beitrag erstellt wird. Und da einige User eifach zu ungeduldig sind, drücken sie mehrmals auf den Button und somit werden mehrmals die Mails versand. Hierzu meine Frage, was kann ich machen damit dies schneller geht?


    2. Wenn dann die Mail versand wird, empfängt man die Mail. Bei der empfangenen Mail ist es aber so, das man manchmal nur den Betreff lesen kann und die Mail an sich nicht öffnen kann. ( die ersten 50 werden komplett versand) Woran liegt das?


    hier mein Quelltext:


    $result = mysql_query($db2_query,$db_connection);



    $num = mysql_numrows($result);
    for ($i = 0; $i < $num; $i++) {
    $row = mysql_fetch_array($result);
    if ($row[subscriptionall] = "JA")
    {
    $Betreff = "Ein neuer Beitrag zum Thema '$topic' wurde im test-Forum verfasst.";
    $text = "Ein neuer Beitrag zum Thema '$topic' wurde im test-Forum verfasst.\n\n";
    $text = $text . "Autor: $author[author]\n";
    $text = $text . "Beitragstitel: $topic\n\n";
    $text = $text . "Beitragstext: \n$author[message]\n";
    echo $text;
    echo $Betreff;
    echo "Vorname : $row[firstname]<br>";
    me : $row[firstname]<br>";
    echo "Nachname : $row[surname]<br>";
    echo "Emailadresse : $row[email]<br>";
    echo "Ja? : $row[subscriptionall]<br>";
    }
    else { echo "Nicht geklappt";}



    $email='Toasty<'Test<Test@test.de>'>';
    /* Empfänger */
    $empfaenger = array($email);

    /* Empfänger CC */
    $empfaengerCC = array('Test<Test@test.de>');

    /* Empfänger BCC */
    $empfaengerBCC = array('Test<Test@test.de>');

    /* Absender */
    $absender = 'Test<Test@test.de>';

    /* Rueckantwort */
    $reply = 'Test<Test@test.de>';

    /* Betreff */
    $subject = $Betreff;

    /* Nachricht */
    $message = $author[message];



    /* Baut Header der Mail zusammen */
    $headers .= 'From:' . $absender . "\n";
    $headers .= 'Reply-To:' . $reply . "\n";
    $headers .= 'X-Mailer: PHP/' . phpversion() . "\n";
    $headers .= 'X-Sender-IP: ' . $REMOTE_ADDR . "\n";
    $headers .= "Content-type: text/html\n";

    // Extrahiere Emailadressen
    $empfaengerString = implode(',', $empfaenger);
    //$empfaengerCCString = implode(',', $empfaengerCC);
    //$empfaengerBCCString = implode(',', $empfaengerBCC);

    /* Verschicken der Mail */
    mail ($empfaengerString, $subject, $text, $headers);
    }
    }

  • #2
    Kann mir denn niemand helfen???

    Kommentar


    • #3
      Fast dein gesamter Code wird so oft ausgeführt, wie du Datensätze aus der DB holst. Muß das wirklich sein? Gehts nicht mit BCC?

      Kommentar


      • #4
        Durch BCC kann man doch erkennen an wenn alles die Mail ging oder?
        oder wie gemeint?

        Kommentar


        • #5
          oder!

          Kommentar


          • #6
            "oder!" was meinst du damit?

            Kommentar


            • #7
              CC = carbon copy
              BCC = blind CC

              Das weiß doch eigentlich jeder, der schon mal eine Mail geschrieben hat und jemand, der in Massen welche versenden will, sollte sogar schon die entsprechenden RFCs gelesen haben.

              Kommentar


              • #8
                Es tut mir sorry, dat habe ich net gewusst. Ich habe nur festgestellt das anschließend immer ein Riesen Rattensschwanz dran klebt. Werds ma ausprobieren. Vielen dank schonma. Wenns net klappt, werd ich mich nochma melden.

                Kommentar


                • #9
                  Ich habe gerade nocha überlegt. der Ablauf müsste ja folgender sein. Ichb lese die Emailadressen in einer Variable mit einer While schleife ein. Danach müsste ich diese ja in den BCC string bringen. Aber um das wiederum hinzubekommen müsste ich ja wiede eine schleife machen um den BCC string auszulesen. Das wäre doch dann wiede rgenauso aufwendig. Oder wie würdest du es machen?

                  Kommentar


                  • #10
                    Es ist bekannt und steht im php-Manual, dass mail() für den Massenversand nicht geeignet ist und langsam. Zur Vermeidung von SPAM kann ein hoster zudem eine Limite, wie zB. deine 50 mails, einbauen. Von der Sache her ist ein Bcc: header für die Empfängerliste das richtige, und dann ein einziger mail() Aufruf. Die zeitaufwändige Schleife sind die vielen mail() aufrufe, nicht die Schleife um ein Bcc: aufzubauen.

                    Kommentar


                    • #11
                      Achso, das würde also bedeuten wenn ich denn jetzt ein BCC empfänger fertig mache, dann dürfte es schneller werden. aber wie mache ich des denn das alle Mails Anständig vershcickt werden. wenn nicht mit Mail()???

                      Kommentar


                      • #12
                        mit einem mail() und einem langen Bcc:

                        Falls dann immer noch die 50-Empfänger-Limite gilt, kann möglicherweise nichts gemacht werden. Zuerst mal ausprobieren, ob die Limite gilt!

                        Es gibt Varianten anstatt mail(), zum Beispiel phpmailer und pear::Mail. Aber ich würde zuerst das gewöhnliche mail() ausreizen, das reicht für deine sofortigen Zwecke vermutlich aus und erfordert keinen weiteren sofortigen Lern- und Installationsaufwand.

                        Kommentar


                        • #13
                          Wie sejhaa schon erwähnte, haben viele Hoster ein Limit für die Anzahl tatsächlicher Mails, die durch einen Aufruf von mail() generiert werden können. Das merkt man PHP-seitig nicht.

                          Hintergründe:
                          Man kann mail() beliebig viele Empänger mitgeben, die Funktion bzw. PHP selbst verhindern das nicht.
                          mail() übergibt die Parameter dem Mailserver, der für jeden BCC-Eintrag eine Kopie der Mail erzeugt und verschickt. Und genau hier setzen Hoster gern ein Limit: Der Mailserver erzeugt für die ersten x BCC-Einträge die Kopie und beachtet alle weiteren überhaupt nicht. Da er das PHP aber nicht mitteilen kann, erfährt dein Script nichts davon, dein Aufruf von mail() liefert true ...

                          Was nun?
                          1. Informiere dich, ob dein Hoster so ein Limit hat.
                          2. Hole alle Empfänger aus der DB in ein Array.
                          3. Durchlaufe eine Schleife "Anzahl Empfänger durch Limit" Mal und
                          3.1. sende jeweils eine Mail mit "Limit" vielen Empfängern im BCC-Feld
                          3.2. merke dir, wer schon eine Mail bekommen hat (Offset im Array)

                          Um das Forum dadurch möglichst wenig zu bremsen, würde ich das ganze in einen externen Prozess auslagern. Dein Script ruft kurz ein anderes auf, übergibt dabei notwendige Parameter, wartet aber nicht auf dessen Abarbeitung sondern fährt sofort mit anderen Dingen fort.
                          Das andere Script erledigt nun in aller Ruhe 1.-3. von oben.

                          Kommentar


                          • #14
                            alles klar, setze mich jetzt ran. meld mich dann nochma obs geklappt hat.

                            Kommentar


                            • #15
                              http://www.php-resource.de/forum/sho...threadid=11993

                              Hier ist noch was nützliches. Damit kannst Du einen beliebigen SMTP server mit Authentifizierung zum Versand benützen, anstatt denjenigen deines free-hosters. Warum vermute ich, dass Du einen free-hoster hast? Ein pay-hoster wird keine 50-Empfänger-Limitierung pro irgendetwas haben.

                              Kommentar

                              Lädt...
                              X