E-Mails direkt über SMTP versenden

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

  • E-Mails direkt über SMTP versenden

    Hallo,

    ich möchte gerne E-Mails direkt an einen SMTP versenden. (Ich weiß, dass es Sendmail und andere Klassen gibt...)
    Das klappt eigentlich auch ganz gut, aber hin und wieder bekomme ich vom Server einfach keine Antwort mehr.

    Hier mal ne Log:
    C Connect to mail.empfaenger.de
    S 220 mail.empfaenger.de ESMTP
    C HELO sender.de
    S 250 mail.empfaenger.de Ok. (16.43 ms)
    C MAIL FROM: <email@sender.de>
    S 250 Ok. (16.44 ms)
    C RCPT TO: <email@empfaenger.de>
    S (1999.85 ms)
    C Close socket connection
    S Connection closed gracefully
    Eine Domain wäre z.B. exeland.de

    Mein Vorgehen:
    Ich öffne eine Socket-Verbindung mittels fsocket.
    Sende mein Kommando.
    Lese die Antwort aus.
    Schließe die Verbindung.

    PHP-Code:
    $cmds = array(
        
    //'helo' => "HELO sender.de",
        
    'helo' => "EHLO sender.de",
        
    'from' => "MAIL FROM:<email@sender.de>",
        
    'rcpt' => "RCPT TO:<".$email.">",
        
    'data' => 'DATA',
        ...
    );

    $sock fsockopen($mx_record$port);
    fwrite($sock$cmds['helo']."\r\n");
    echo 
    fgets($sock);
    fwrite($sock$cmds['from']."\r\n");
    echo 
    fgets($sock);
    fwrite($sock$cmds['rcpt']."\r\n");
    echo 
    fgets($sock);
    ...
    fclose($sock); 
    Die Befehle sind auch alle in Ordnung, da es in 80% alle Fälle reibungslos funktioniert. Ich habe es sowohl mit dem Startbefehl HELO, als auch mit EHLO versucht.
    Das Ergebnis ist das gleiche.

    Seht ihr vielleicht, woran es evtl. liegen könnte?
    Vielen Dank.
    Zuletzt geändert von Piremilok; 28.05.2010, 09:21.

  • #2
    Tritt dieses Phänomen nur nach RCPT-TO auf?
    Welche SMTP-Software läuft bei der Gegenstelle, wenn das Phänomen auftritt? Immer die selbe, vielleicht sogar eine bestimmte Version oder siehst du da keinen Zusammenhang?
    Kannst du Socketfehler jeglicher Art auf deiner Seite ausschließen, z.B. weil du den Code schon auf anderen (Betriebs-)Systemen getestet hast und dort ebenfalls das Phänomen auftrat?

    Kommentar


    • #3
      Hi,

      das Phänomen tritt immer nach RCPT TO auf. Nur dort.
      Hier noch ein paar Begrüßungen von Mailservern:

      S 220 remote.age.ch Microsoft ESMTP MAIL Service ready at Tue, 25 May 2010 21:39:13 +0200
      S 220 11.mx.freenet.de ESMTP Exim 4.72
      S 220 mail.viscomp.bg ESMTP Postfix (Debian/GNU)
      S 220 mx.europublic.de Microsoft ESMTP MAIL Service, Version: 6.0.3790.4675 ready at Tue, 25 May 2010 21:42:08 +0200
      S 220 h954778.serverkompetenz.net ESMTP
      S 220 mail.cs.vassar.edu ESMTP Postfix (Debian/GNU)
      S 220 mail.ip4-gmbh.de ESMTP Exim 4.63 Tue, 25 May 2010 22:03:35 +0200
      S 220 relay.tronicplanet.de ESMTP
      S 220 www.aposolutions.com ESMTP
      S 220 mx1.heinlein-support.de ESMTP Postfix
      S 220 SMTP Server #40 p=40 q=49 s=36
      S 220 mail.nassau.dk SMTP service ready
      Auffällig ist, dass die meisten ESMTP-Server sind. Jedoch sind auch viele dabei, die einfach nur SMTP ausgeben (oder gar nichts).

      Ansonsten ist die eingesetzte Software ziemlich verschieden.
      Kann das leider nicht auf verschiedenen Systemen von mir aus testen.
      Also ich hab das auf meinem Rechner privat (xampp) und online auf meinem Webspace getestet.

      Kommentar


      • #4
        Nach dem Senden eines Kommandos liest du mit fgets() jeweils eine Zeile, jedoch ist die Antwort des Servers, vor allem nach EHLO, i.d.R. mehrzeilig. Hole dir mal die kompletten Antworten und schau sie im Fehlerfall genauer an.

        Kommentar


        • #5
          Hi,

          das mache ich.
          Das waren auch immer die kompletten Antworten der Server.
          Da ich immer mit HELO begrüße, gibt er mir nicht die erweiterten Informationen von EHLO aus.
          Jedoch habe ich testweise das Ganze auch mit EHLO probiert und erhalte aber wieder keine Antwort vom Server.

          Ich werd das aber nochmal umschreiben, sodass er bei ESMTP immer mit EHLO
          begrüßt.

          Hier mein Code für das Auslesen der Antworten:

          PHP-Code:
          $response = array();
          while(
          preg_match('/^\d\d\d-/'$r fgets($this->sock))) {
              
          $response[] = $r;
          }
          $response[] = $r

          Hier noch einmal eine Log mit ESMTP. Er reagiert auch nicht mehr auf danach folgende Befehle...
          C Connect to exeland.de
          S 220 exeland-Server.ff9.de ESMTP exeland-Server.ff9.de
          C EHLO sender.de
          S 250-exeland-Server.ff9.de
          250-PIPELINING
          250-SIZE 629145600
          250-VRFY
          250-ETRN
          250-STARTTLS
          250-AUTH PLAIN LOGIN
          250-AUTH=PLAIN LOGIN
          250-XVERP
          250 8BITMIME (18.10 ms)
          C MAIL FROM: <email@sender.de>
          S 250 Ok (83.68 ms)
          C RCPT TO: <irgendwas@exeland.de>
          S (1999.28 ms)
          C QUIT
          S (2000.30 ms)
          C Close socket connection
          S Connection closed gracefully
          Zuletzt geändert von Piremilok; 27.05.2010, 08:38.

          Kommentar


          • #6
            Ich vermute inzwischen, dass die Mailserver, die irgendwann nicht mehr antworten, dich nur in der Leitung halten wollen, um deine Ressourcen zu binden. Sonst würden sie ordnungsgemäß mit einem SMTP-Code antworten.
            Steht dein Server in irgendwelchen RBLs?
            Stimmt der Reverse-DNS-Eintrag zu deiner IP mit dem überein, was du beim HELO/EHLO angibst?
            Existiert die Absenderadresse (MAIL-FROM)?
            Wie stehts mit MX- und SPF-Einträgen für die Absenderdomain?
            Existiert die Empfängeradresse?
            Wird die Empfängerdomain wirklich vom angerufenen MX geführt?

            Kommentar


            • #7
              Hi,

              1. Ja, steht auf 1 Blacklist, aber erst seit heute morgen. Die Probleme sind aber seit längerem und aktuelle Tests von gerade eben liefern immernoch das gleiche Problem.

              2. Reverse-DNS-Eintrag: Müsste stimmen, gebe die meine Domain an, und rufe das Script über diese Domain auch auf.

              3. Absendermail existiert

              4. MX-Einträge existieren auch, da ja die Absendermail existiert und ich darüber auch E-Mails empfangen und verschicken kann.

              5. Empfängeradresse existiert

              6. Mit getmxrr() suche ich erstmal nach mx-records für die Domain und connecte anschließend zu diesen. D.h. die Empfänger-Mailadresse müsste darüber erreichbar sein.


              Vielen Dank schon einmal für die bisherige Hilfe.

              gruß
              Piremilok
              Zuletzt geändert von Piremilok; 27.05.2010, 22:24.

              Kommentar


              • #8
                Hallo,

                hast du die SMTP-Session schon mal mit telnet durchgespielt? Da sieht man am ehesten, was wirklich passiert.

                Gruß,

                Amica
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Hi,

                  vielen Dank für den Tipp.
                  Hatte ich vorher nicht.

                  Also, die Server antworten scheinbar alle, nur brauchen sie ziemlich lange.
                  Einer gab mir aus, dass er RBLs gecheckt hat und meine dynam. IP (Telnet --> mein Computer) nicht zulässig ist.

                  Dann ist mir aufgefallen, dass der Abbruch immer nach ca. 2 Sekunden erfolgt.
                  Ich habe beim Öffnen der Verbindung stream_set_timeout() auf 2 Sekunden gesetzt. Nachdem ich diesen auf 10 Sekunden erhöht habe erhalte ich auch die Meldungen per fgets zurückgeliefert.

                  An und für sich ist das aber keine dauerhafte Lösung, denn mehrfach 5-10 Sekunden nur auf ne Serverantwort zu warten verbraucht immens Zeit...
                  Aber ich sehe leider auch keine Möglichkeit das zu optimieren.
                  Ihr etwa?

                  Vielen Dank noch einmal für eure Hilfe.
                  Ihr habt mir sehr geholfen.




                  gruß
                  Piremilok

                  Kommentar


                  • #10
                    Zitat von Piremilok Beitrag anzeigen
                    An und für sich ist das aber keine dauerhafte Lösung, denn mehrfach 5-10 Sekunden nur auf ne Serverantwort zu warten verbraucht immens Zeit...
                    Die SMTP-Spezifikation macht keine Vorgaben zu Timeouts. Meistens nimmt man 30 Sekunden. Wenn dir damit das Versenden aller Mails zu lange dauert, kannst du es parallelisieren - dein OS kann mehrere tausend Sockets gleichzeitig handeln.

                    Reagierst du eigentlich auf temporäre Fehler, z.B. Greylisting? Versuchst du die Mail später erneut zu versenden?

                    Kommentar


                    • #11
                      Hi,

                      die Fehler fange ich alle ab und verarbeite sie (Greylisting, Block von Server, 550 unverified address, etc.).

                      Das Problem mit den gleichzeitigen Verbindungen ist, wenn dann zufällig mehrere Sockets auf den gleichen SMTP-Server connecten, dann besteht doch die Gefahr, dass er wegen zu vieler gleicher Verbindungen abblockt. Und dabei evtl. auch die IP erstmal sperrt.

                      Das Problem ist nicht das abblocken, sondern auslesen der Fehlermeldungen. Manche antworten mit Beschreibung des Problems, andere sagen einfach nur Fehler. Woher weiß ich sicher, ob ich bei nem 421 geblockt wurde oder einfach nur zu viele Connections offen sind?

                      Kommentar


                      • #12
                        @onemorenerd: parallelisieren? Ich dachte immer PHP ist eher imperativ mit Ansätzen von OOP.
                        Wie kann ich denn nebenläufiges Verhalten realisieren ohne das Script mehrfach gleichzeitig auszuführen?


                        Edit: Sofern das nur über Process Control geht, ist es zwar interessant, aber wird von meinem Hoster nicht unterstützt. Und dass er die PHP-Version für mich extra kompiliert glaube ich nicht. Leider...
                        Zuletzt geändert von Piremilok; 29.05.2010, 10:05.

                        Kommentar


                        • #13
                          Hallo,

                          ich glaube, onemorenerd meinte nur die Verbindungen. In der Zeit, wo du auf die Daten der einen Verbindung wartest, kannst du die einer anderen bereits verarbeiten. Dafür gibt es solche Funktionen wie socket_select oder stream_select.

                          Gruß,

                          Amica
                          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                          Super, danke!
                          [/COLOR]

                          Kommentar


                          • #14
                            Hi,

                            vielen Dank für die Antwort.
                            Das Thema klingt wirklich interessant und bin gerade dabei mich einzulesen, scheint aber nicht ganz einfach zu sein ;-)

                            Nochmals vielen Dank für eure Hilfe.

                            gruß
                            Piremilok

                            Kommentar

                            Lädt...
                            X