Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] phpmailer und Return-Path

Einklappen

Neue Werbung 2019

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

  • [Erledigt] phpmailer und Return-Path

    Der Return-Path wird bei der mail()-Anweisung ja durch den fünften Parameter -f gesetzt. Wenn ich eine mail mit der nackten mail()-Anweisung sende, dann klappt das auch.

    Beim phpmailer mache ich das so:

    PHP-Code:
    require("class.phpmailer.php");
    $mail = new PHPMailer();
    $mail->From     $absender;
    $mail->FromName $absendername;
    $mail->AddReplyTo($absender);

    // So soll man den Return-Path setzen
    $mail->Sender     $absender;

    $mail->CharSet  =  "utf-8";

    $mail->AddAddress($email);
    $mail->Body $mailtext;
    $mail->Send(); 
    $mail->Sender = $absender; scheint falsch zu sein, denn der Return-Path wird nicht auf das Absenderpostfach gebogen. Zur Erinnerung: Bei -f$absender mit mail() funktioniert das einwandfrei.
    From, FromName und ReplyTo werden hingegen richtig gesetzt.

    Was mache ich falsch?


    Wenn ich class.phpmailer.php anschaue, dann finde ich dort:
    PHP-Code:
      /**
       * Sets the Sender email (Return-Path) of the message.  If not empty,
       * will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
       * @var string
       */
      
    var $Sender            '';


    // und weiter unten

        
    if($this->Sender == '') {
          
    $result .= $this->HeaderLine('Return-Path'trim($this->From));
        } else {
          
    $result .= $this->HeaderLine('Return-Path'trim($this->Sender));
        } 
    Offensichtlich soll der Return-Path auf den übergebenen Absender gesetzt werden, wenn kein Sender übergeben wird. Aber auch das macht der phpmailer nicht. lasse ich die Zeile
    $mail->Sender = $absender;
    weg, dann habe ich das gleiche, falsche Ergebnis. Return-Path: bleibt ungesetzt.

    Habe ich eine phpmailer-Einstellung vergessen?

  • #2
    Wenn Du keinen Debugger zur Hand hast, kannst Du es ja mal mit
    PHP-Code:
    if($this->Sender == '') {
        echo 
    '<p>Return-Path/From: ' $this->From '</p>';
      
    $result .= $this->HeaderLine('Return-Path'trim($this->From));
    } else {
        echo 
    '<p>Return-Path/Sender: ' $this->Sender '</p>';
      
    $result .= $this->HeaderLine('Return-Path'trim($this->Sender));

    versuchen.

    Kommentar


    • #3
      Dankesehr. Ich hatte eher gedacht, dass ich das Dingens falsch bediene, aber nun habe ich die Klasse debugged und hab die Gurke gefunden:

      Der -f Parameter funktioniert ja wie bekannt nicht bei safe_mode=on. Daher fragt phpmailer ab, ob der Server im safe mode läuft:

      PHP-Code:
      if ($this->Sender != '' && strlen(ini_get('safe_mode')) < 1) { 
      ini_get('safe_mode') steht aber nicht, wie hier vorausgesetzt auf '', sondern auf 0, daher scheitert der zweite Teil der if-Abfrage. Ich weiß nicht, ob dieser Server sich komisch verhält, aber ich hab jetzt erstmal das Problem geflickt.

      Kommentar


      • #4
        Das wäre einen Tipp an die phpmailer Macher wert!

        Kommentar


        • #5
          PHPMailer ist sicherlich ein tolles Paket. Aber hast Du Dir vielleicht mal Swift Mailer - A free feature-rich PHP Mailer angesehen?

          Kommentar


          • #6
            Welcher der beiden kann eigentlich Multimailing? So Newsletterartig mit Stack und evtl. Cronjobs?

            Kommentar


            • #7
              Letztendlich baut phpmailer "nur" auf Zuruf die richtigen Header und reicht das Ganze dann weiter an einen SMTP-Server, an Sendmail, oder an mail(). Die Sendelogik muss man schon selbst drumrum schreiben.

              Meine eigenen selbstfrabrizierten Header unterscheiden sich nur in einer einzigen Zeile von den phpmailer-Headern, nämlich um diese:
              X-Mailer: PHPMailer
              aber als ich mit UTF-8 angefangen habe, hab ich mich überzeugen lassen, die Arbeit zu vereinfachen

              Swiftmailer schau ich mir auch mal an, aber ich glaube nicht wirklich, dass der andere Ergebnisse produziert.

              Kommentar


              • #8
                Cronjobs weiß ich jetzt nicht - als Bestandteil des Mailers selbst?

                Aber für Multimailing hat SwiftMailer ein paar Sachen.
                Zum Beispiel Sending a batch email or newsletter [SwiftMailer Docs] oder Swift Message Decorator Plugin (For Customized Messages) [SwiftMailer Docs]

                Kommentar


                • #9
                  $recipients->addTo("recipient1@address.tld", "Recipient 1");
                  $recipients->addTo("recipient2@address.tld", "Another recipient");

                  $swift->batchSend($message, $recipients, new Swift_Address("company@domain.tld", "Our Company"));
                  Solch ein Feature hat phpmailer auch, man baut einfach mehrere Zeilen
                  $mail->AddAddress($email1);
                  $mail->AddAddress($email2);

                  Das ist aber für Newsletter nur dann zu gebrauchen, wenn jeder Teilnehmer exakt den gleichen Text bekommen soll. Wenn man personalisieren will, dann kann man das abhaken.

                  Kommentar


                  • #10
                    Genau dafür ist der Decorator bei SwiftMailer gedacht

                    Kommentar


                    • #11
                      Jo david, den hab ich mir angeschaut, aber genau das gleiche mache ich bei der Schleife durch die gelesenen mails auch schon - das ist nicht wirklich ws neues:

                      Mailtemplate in den Cache einlesen
                      SELECT alles was ne mail kriegen soll
                      WHILE (noch ne Zeile da) {

                      Mail personalisieren
                      Mail senden

                      }

                      Die meiste Zeit beim Scriptablauf wird durch den Datenbankzugriff verplempert, die mails gehen schneller raus als man sie bauen kann. Insofern wäre eine weitere Beschleunigung der Verarbeitung sehr wünschenswert. Ausprobieren kann ich das ja mal, ich sehe aber wie gesagt nicht wirklich was neues.

                      Kommentar


                      • #12
                        Naja, für mich ist es schon ein Unterschied, ob man selbst alles schreiben muss oder nur den individuellen Teil erstellt - also das Feld übergibt oder eine einfach Methode überschreibt. Dafür verwende ich doch überhaupt so einen Mailer, denn machen kann man das auch fst alles mit mail()

                        Spannend wäre ja auch noch, was Du bei
                        Mail personalisieren
                        Mail senden
                        genau machst. Denn das Caching bei Swift ist schon etwas ...sagen wir mal "feinfühliger". Bei kleineren mails mit wenig oder auch nur einem Part wird das nicht auffallen (vielleicht sogar eher negativ). Aber wenn es komplexer wird, macht sich das bezahlt.
                        Die eigentliche Ersetzung findet letztendlich (vermutlich wie bei Dir) mittels str_replace statt. Aber das ist ja sozusagen nur der triviale Teil.

                        Kommentar


                        • #13
                          Ich habe ein Mailformular mit Platzhaltern, welches zuerst eingelesen wird.

                          Zu Beginn einer mail hole ich mir eine Kopie dieses Formulars und ersetze die Platzhalter mit Userdaten. Das modifizierte Mailformular wird dann dem phpmailer übergeben.
                          Beim nächsten Schleifendurchlauf hole ich mir wieder eine Kopie des Formulars. Usw. usf.

                          Wie gesagt, man müsste mal ausprobieren, wie viel schneller Swiftmailer das hinbekommt, vor allem, wenn der Decorator 200 Datasets bekommt. Die Übergabe der Daten an den Decorator ist auch nur ein $dies = $das und danach muss der eine interne Schleife durch 200 Sets durchführen. Daten ersetzen kann das Dingens auch nicht mit dem Zauberstab, sondern mit str_replace oder strtr o.ä.

                          Kommentar


                          • #14
                            Zitat von Wolla Beitrag anzeigen
                            Daten ersetzen kann das Dingens auch nicht mit dem Zauberstab, sondern mit str_replace oder strtr o.ä.
                            Ja, habe ich doch geschrieben.

                            Ok, Du willst irgendein Beispiel, was mit SwiftMailer geht aber nicht mit PHPMailer.
                            SwiftMailer muss die Attachment-Dateien nicht vollständig in den Speicher lesen. Du kannst also auch ein 12MB Attachment bei einem Speicherlimit von 8MB verschicken. PHPMailer liest die Datei komplett per file_get_contents() ein.

                            Außerdem kannst Du bei Swiftmailer so ziemlich jeden einzelnen Baustein ersetzen, da es wesentlich modularer aufgebaut ist.
                            (Auch) deshalb gibt es plugins wie zum Beispiel Swift_Connection_Rotator [SwiftMailer Docs]


                            So genug Werbung, denn im Grunde ist es mir herzlich egal, wie und womit jeder seine eMails in die Welt schaufelt

                            Kommentar


                            • #15
                              PHP-Code:
                              $mail->AddAddress($email2); 
                              Ja gut, soweit klar. Ich kann auch mail () in einer Schleife absetzen. Interessant ist jedoch, daher der Verweis auf cron-jobs, ob der Mailer eine Art Zwischenspeicher bereithält und ein Script, auf das man den Cron ansetzen kann und das diesen Speicher dann abarbeitet. Das wäre für mich jedenfalls ein optimales Multimailer Feature (ohne dass es jetzt eine Verwaltungsoberfläche oder ähnlichen Schnickschnack für Mails gäbe). Mit mail () in einer Schleife erreicht man nämlich ziemlich schnell das Ende der Fahnenstange.
                              Ein weiteres Qualitätskriterium ist Feedback-Auswertung. Z.B. Mail xy ist nicht angekommen, wenn Servermeldung abc dann erneut in den Queue stellen, etc. pp. mail () gibt nur ein TRUE/FALSE zurück und das ist noch nicht mal ein Grant für ein erfolgreiches Absenden.

                              Kommentar

                              Lädt...
                              X