Mails in PHP lesen

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Original geschrieben von themonk
    ]Hab nun nach Zeien umbrüchen getrennt mit ...
    Und warum trennst du nicht nach
    --========GMXBoundary253351105102357 ?

    Comment


    • #17
      genau das meine ich!

      Comment


      • #18
        Original geschrieben von Heini81
        Und warum trennst du nicht nach
        --========GMXBoundary253351105102357 ?
        Erstens, weil GMXBoundary253351105102357 nicht immer da steht wenn ich mir ne mail von web mit Anhang schicke ist das nicht so und wenn ich über ein Script mir ne mail mit Anhang schicke sthet unten garnnichts.
        Und Zweitens finde ich nicht wie ich nach einem Bestimmten Wort trennen kann

        Comment


        • #19
          deswegen sollst du ja preg_ benutzen.

          Muss nochmal ausdrücklich sagen, dass ich den Thread nicht komplett gelesen habe, sondern lediglich auf aktuelle Postings antworte...)

          Comment


          • #20
            Original geschrieben von themonk
            Erstens, weil GMXBoundary253351105102357 nicht immer da steht wenn ich mir ne mail von web mit Anhang schicke ist das nicht so und wenn ich über ein Script mir ne mail mit Anhang schicke sthet unten garnnichts.
            Und Zweitens finde ich nicht wie ich nach einem Bestimmten Wort trennen kann
            http://www.ietf.org/rfc/rfc1341.txt?number=1341
            Lesen!
            Rausfinden: wie, was, wo und warum!
            Pattern für preg_split/preg_match/sonstwas basteln!
            Benutzen!
            Fertig!

            Was ist das Problem? Wenn du es wirklich vernünftig haben willst, wirst du nicht drumherum kommen das RFC zu lesen um rauszufinden, wie das denn genau funktioniert, was diese Zeile oben ist, wie man sie vielleicht rausfinden kann, sonstwas.....du erwartest von uns, dass wir das können, aber wir haben nunmal auch keinen Bock das alles zu lesen, damit dein Code funktioniert....
            Du kannst natürlich auch auf gut Glück einfach mal mit preg_split trennen nach den Strichen, irgendwas mit Boundary und dahinter ne Zahl, nur wer weiß ob das immer so funktioniert, wie du es willst....

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

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

            Comment


            • #21
              Original geschrieben von ghostgambler
              du erwartest von uns, dass wir das können, aber wir haben nunmal auch keinen Bock das alles zu lesen, damit dein Code funktioniert
              Ne erwarten tu ich das nicht und ich will auch nicht das ihr euch extra Arbeit macht und die Texte für mich lest .
              Aber es hätte ja sein können das irgendwer in diesem Forum das selbe wie ich vor hatte und dann mir dabei helfen könnte ohne sich extra Arbeit zu machen.

              Comment


              • #22
                Original geschrieben von themonk
                Ne erwarten tu ich das nicht und ich will auch nicht das ihr euch extra Arbeit macht und die Texte für mich lest .
                Aber es hätte ja sein können das irgendwer in diesem Forum das selbe wie ich vor hatte und dann mir dabei helfen könnte ohne sich extra Arbeit zu machen.
                Scheint nicht so....

                okay, du hast es geschafft, ich lese mir grade das RFC durch ^^

                Also, ich habs jetzt mal überflogen und bin dabei auf folgendes gestoßen
                From: Nathaniel Borenstein <nsb@bellcore.com>
                To: Ned Freed <ned@innosoft.com>
                Subject: Sample message
                MIME-Version: 1.0
                Content-type: multipart/mixed; boundary="simple
                boundary"

                This is the preamble. It is to be ignored, though it
                is a handy place for mail composers to include an
                explanatory note to non-MIME compliant readers.
                --simple boundary

                This is implicitly typed plain ASCII text.
                It does NOT end with a linebreak.
                --simple boundary
                Content-type: text/plain; charset=us-ascii

                This is explicitly typed plain ASCII text.
                It DOES end with a linebreak.

                --simple boundary--
                This is the epilogue. It is also to be ignored.
                Und der Rest dürfte eigentlich selbsterklärend sein, oder?

                E-Mail-Header einlesen, nach dem Header MIME-Version suchen, wenn nicht da, E-Mail normal ausgeben. Wenn da, weiter suchen nach Content-type, diesen splitten, sodass man dass hinter boundary bekommt.
                Und dann auf die Message
                $teile = eplode('teil zwischen den Anführungszeichen hinter boundary= im Header der Mail+\r\n, damit das nicht mit drin ist im Array und davor müssen noch zwei Bindestriche--', 'e-Mail-Body')
                Und dann hast du in $teile ein schönes Array, mit allen Teilen der Mail.
                Wie du oben noch siehst, muss dein Skript alles in E-Mail-Body, was vor dem ersten vorkommen des Boundarys kommt ignorieren und das dahinter auch, also nur das, was eingeschlossen ist von nem Boundary
                Der String boundary trennt die Mail jedoch nicht nur, sondern wie eben in der Funktion steht, kommen in der Mail davor noch 2 Bindestriche
                --simple boundary
                Und das Ende wird durch nochmal 2 Unterstriche hinter dem simple boundary markiert
                --simple boundary--
                und alles was dahinter kommt, muss auch wieder ignoriert werden.

                Außerdem muss dein Skript noch die "zusätzlichen MIME-Header" vor dem Inhalt von jedem boundary parsen, d.h. auslesen wie es kodiert ist, dementsprechen dekodieren, rausfinden, was das für ein Typ von boundary ist (um dem User nicht eine per base64 verschlüsselte Grafik vor den Latz zu knallen), usw.

                Der Rest sollte aus dem kleinen Beispiel oben hervorgehen, und ich habe mir dafür nicht das gesamte RFC durchgelesen, d.h. soviel Arbeit war das nicht, d.h. die hättest du auch locker selbst machen können, d.h.: Wenn du das nächste mal so ein Problem hast, machsu erstmal selbst was und kommst angekrochen, wenn du nicht weiter weißt und unsere Hilfen dich auch nicht mehr weiter bringen

                So, ich geh frühstücken

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

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

                Comment


                • #23
                  Hallo
                  erstmal danke für diese Erklärung.
                  Aber mein erstes Problem ist schon da
                  E-Mail-Header einlesen
                  Wie soll das gehen?
                  Ich lese den Header so ein

                  PHP Code:
                  echo "From Address:  ";
                  echo 
                  $fromaddr=sprintf("%s@%s",
                                         
                  $from[0]->mailbox,
                                         
                  $from[0]->host).
                                         
                  "<BR>";
                  echo 
                  "Personal    :  ".
                       
                  $from[0]->personal.
                       
                  "<br>";
                  echo 
                  "Adl        :  ".
                       
                  $from[0]->adl.
                       
                  "<br>";
                  echo 
                  "Mailbox    :  ".
                       
                  $from[0]->mailbox.
                       
                  "<br>";
                  echo 
                  "Host        :  ".
                       
                  $from[0]->host.
                       
                  "<br>";
                  echo 
                  "Subject    :  ".
                       
                  $subject.
                       
                  "<br>";
                  echo 
                  "Date        :  ".
                       
                  $date.
                       
                  "<br>";
                  echo 
                  "To Address  :  ".
                       
                  $header->toaddress.
                       
                  "<br><BR><BR>"
                  und dann wird mir das ganze so angezeigt.

                  From Address: email@adress.de
                  Personal : Emai Name
                  Adl : steht bei mir gar nichts
                  Mailbox : name der Mailbox der gesendet hat
                  Host : von welcehm anbieter
                  Subject : betreff
                  Date :datum
                  To Address : zu@mir.de
                  Aber das ist nicht so angeordnet wie es hier steht http://www.ietf.org/rfc/rfc1341.txt?number=1341 und bei php.net habe ich keinen andere möglichkeiten im Header gefunden.
                  Hier könnt ihr euch das mal ansehen wie das aussieht
                  http://test.h-denkena.de/
                  Die erste Mail habe ich von GMX geschickt die zweite über ein Script

                  Comment


                  • #24
                    hab jetzt nicht den ganzen thread gelesen, aber "echo" liest nichts ein, sonder gibt etwas aus.

                    ghostgambler schlägt vor, das, was ausgibst, erstmal auszuwerten. sehe ich das richtig?

                    Comment


                    • #25
                      Original geschrieben von penizillin
                      hab jetzt nicht den ganzen thread gelesen, aber "echo" liest nichts ein, sonder gibt etwas aus.

                      ghostgambler schlägt vor, das, was ausgibst, erstmal auszuwerten. sehe ich das richtig?
                      ja echo gibt was aus.
                      Aber es schadet doch auch nicht, wenn man erst ausgiebt die Daten gehen dabei ja nicht verloren.
                      Wie soll ich das den Auswerten?
                      ghostgambler hat gesagt das ich erstmal das ganze überprüfen soll, ob in dem Text MIME-Version steht.
                      Aber er hat auch gesagt das ich den E-Mail-Header einlesen soll und das habe ich ja auch versucht.
                      Nur ich bekomme diese Daten mit MIME nur in den Body.

                      Comment


                      • #26
                        Original geschrieben von themonk
                        Hallo
                        erstmal danke für diese Erklärung.
                        Aber mein erstes Problem ist schon da
                        Wie soll das gehen?
                        Ich lese den Header so ein

                        PHP Code:
                        echo "From Address:  ";
                        echo 
                        $fromaddr=sprintf("%s@%s",
                                               
                        $from[0]->mailbox,
                                               
                        $from[0]->host).
                                               
                        "<BR>";
                        echo 
                        "Personal    :  ".
                             
                        $from[0]->personal.
                             
                        "<br>";
                        echo 
                        "Adl        :  ".
                             
                        $from[0]->adl.
                             
                        "<br>";
                        echo 
                        "Mailbox    :  ".
                             
                        $from[0]->mailbox.
                             
                        "<br>";
                        echo 
                        "Host        :  ".
                             
                        $from[0]->host.
                             
                        "<br>";
                        echo 
                        "Subject    :  ".
                             
                        $subject.
                             
                        "<br>";
                        echo 
                        "Date        :  ".
                             
                        $date.
                             
                        "<br>";
                        echo 
                        "To Address  :  ".
                             
                        $header->toaddress.
                             
                        "<br><BR><BR>"
                        und dann wird mir das ganze so angezeigt.


                        Aber das ist nicht so angeordnet wie es hier steht http://www.ietf.org/rfc/rfc1341.txt?number=1341 und bei php.net habe ich keinen andere möglichkeiten im Header gefunden.
                        Hier könnt ihr euch das mal ansehen wie das aussieht
                        http://test.h-denkena.de/
                        Die erste Mail habe ich von GMX geschickt die zweite über ein Script
                        was ist denn $from[0]->mailbox und $from[0]->host???

                        Wie bekommst du die Daten überhaupt?
                        Also ich gehe jetzt einfach mal davon aus, dass du den Mailheader in der Variablen $header und den Mailbody in $body hast, wenn dem nicht so ist, pack sie einfach so zusammen. So kannst du die eigentlich auch in der Datenbank speichern, weil das theoretisch am praktischsten ist.
                        Und wenn du eh nur Mails abrufen willst, ist IMAP etwas hochgegriffen, d.h. ich würd auf POP3 umsteigen, z.B. nimmst du die Klasse, die in der Kategorie Codeschnipsel ist, ich glaub von TBT wurd die gemacht. Ist zwar schon 2, 3 Jahre alt, und unterstützt auch nicht alle Kommandos, aber sie macht das, was du willst ^^

                        Also, ich gehe mal davon aus, du hast den E-Mail-Header in $header, der dann ungefähr so aussieht:
                        Subject: Text
                        MIM-Version: 1.0
                        From: me@localhost
                        To: you@localhost
                        usw.
                        Und dann lässt du nur über den Header ein preg_match laufen, z.B.
                        PHP Code:
                        // Für das Subject
                        $pattern "#Subject: (.+)\r\n#U";
                        preg_match($pattern$header_der_mail$matches);
                        echo 
                        '<pre>' print_r($matchestrue) . '</pre>'
                        Das Problem können dabei höchstens Header sein, die über mehrere Zeilen gehen, diese werden bei dem pattern nicht mitrausgesucht. D.h. du müsstest den Header zuerst einer Sache unterziehen, die sich da nennt: "unfolding"
                        Weil das n bissle kompliziert zum erklären ist, hab ich mal kurz ne Funktion geschrieben, die dir das so macht, dass du den preg_match rüberlaufen lassen kannst
                        PHP Code:
                        function unfold(&$header)
                        {
                            
                        $pattern "#\r\n[\t ]+#";
                            
                        $replace " ";
                            
                        $header preg_replace($pattern$replace$header);
                            return 
                        true;

                        Ob du die Funktion noch änderst, sodass sie dir den Header zurückgibt, anstatt die original-Variable zu ändern, ist deine Sache

                        So, wo war ich jetzt???...irgendwie hab ich den Faden verloren *drop*.....öh, ich glaub ich war fertig ^^, du nutzt zuerst die unfold-Funktion auf den Header und danach einen ähnlichen Pattern wie oben um den Teil des Headers zu bekommen, den du haben willst. Und damit wäre das Problem doch dann beseitigt, oder?

                        btw. sehe ich grade, dass die Funktion, die du nutzt den E-Mail-Header als Array zurückgibt, ich weiß nicht, ob dann noch der \r\n am Ende vorhanden ist. Sollte dieser weg sein, dann musst du den aus dem Pattern auch entfernen (blöde IMAP-Funktionen -_-)
                        Also wenn du die Mails wirklich nur abrufen/speichern/lesen willst, würde ich dir wirklich zu POP3 raten! IMAP ist mehr für eine Dauerconnection zum Server gedacht, deshalb gibt es ja auch so Sachen wie "Ordner auf dem Server erstellen" usw. und PHP ist nunmal nicht dafür da, um lange ausgeführt zu werden, d.h. ich würd eine POP3-Klasse nutzen, E-Mails abrufen, in MySQL speichern und dann die Ausgabe formatieren.
                        Wenn dir das, was die Klasse von TBT kann zu wenig ist (POP3 kann auch noch ein bisschen mehr), kann ich dir auch meine Klasse geben, die nicht so "handlich" ist, wie die von TBT (fast jede Funktion gibt ein Array zurück, mit nem Haufen Schlüssel und Werte), aber dafür die komplette Sammlung an POP3-Kommandos unterstütz, unter anderem auch das APOP-Kommand, welches das Passwort verschlüsselt über die Leitung schickt, ich weiß zwar nicht, ob alle Server das unterstützen, aber sie kann es zumindest *Werbung macht*

                        Aehja.....verdau das erstmal, was du jetzt hast und komm dann wieder

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

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

                        Comment


                        • #27
                          würde ich dir wirklich zu POP3 raten
                          Ich wusste ehrlich gesagt gar nicht, das da ein Unterschied ist
                          Ist POP3 nicht komplizierter mit den Klassen?

                          Also wenn ich jetzt das ganze mit POP3 machen will. Dann kan ich das von php.net(http://de3.php.net/imap) und das was du eben geschrieben hast vergessen ?

                          Also versuche ich es jetzt mit POP3 scheint bei meinem vorhaben besser zu sein. Mit dem Codeschnipsel von TBT habe ich mich schon auseinandere gesetzt nur wieder erfolglos . Zum Code

                          In der pop3.class.php brauche ich nichts ändern stimmts?
                          Dann habe ich die andere Datei so geändert
                          PHP Code:
                          <?

                          include 'pop3.class.php';
                                   $server = "localhost"; ## oder localhost:110/pop3 ???
                                   $port = 110;
                                   $user = "user";
                                   $pass = "pw ";
                          $pop3 =  POP3( $server, $port, $user, $pass );
                          if ( !$pop3error = $pop3->open() ) {
                          Ist das Richtig?

                          Wenn dir das, was die Klasse von TBT kann zu wenig ist (POP3 kann auch noch ein bisschen mehr), kann ich dir auch meine Klasse geben, die nicht so "handlich" ist, wie die von TBT (fast jede Funktion gibt ein Array zurück, mit nem Haufen Schlüssel und Werte), aber dafür die komplette Sammlung an POP3-Kommandos
                          Auf jeden Fall kan die das was wir hier besprochen haben auch nicht steht zumindest in der TODO "TODO: MIME Mails and Attachment"
                          Last edited by themonk; 08-01-2005, 18:28.

                          Comment


                          • #28
                            Also wenn ich jetzt das ganze mit POP3 machen will. Dann kan ich das von php.net(http://de3.php.net/imap) und das was du eben geschrieben hast vergessen ?
                            du kannst mit den imap-funktionen auch auf pop3 zugreifen. steht aber auch da!

                            Comment


                            • #29
                              Ja das würde auch gehen.
                              Aber in diesem code von TBT steht soweit ich das gesehn habe nichts was auch auf php.net steht, also hat POP3 eigene Funktionen.
                              Deshalb habe ich das geschrieben.

                              EDIT:
                              nochmal zu dem Beitrag von eben mit der Verbindung.
                              Muss das localhost sein oder das was ich bei Outlook auch für POP3 eingebe?

                              Last edited by themonk; 08-01-2005, 18:59.

                              Comment


                              • #30
                                Original geschrieben von themonk
                                Aber in diesem code von TBT steht soweit ich das gesehn habe nichts was auch auf php.net steht, also hat POP3 eigene Funktionen.
                                Deshalb habe ich das geschrieben.
                                Die Klasse kontaktiert den Server direkt, und nutzt dann die F***-Funktionen, die Funktionen von PHP werden das so ähnlich wohl auch machen...



                                PHP Code:
                                <?

                                include 'pop3.class.php';
                                         $server = "mail.gmx.net";
                                         $port = 110;
                                         $user = "78999irgendwas";
                                         $pass = "top_secre*g*";
                                $pop3 =  POP3( $server, $port, $user, $pass );
                                if ( !$pop3error = $pop3->open() ) {
                                So würde es bei mir lauten, bei GMX, wenn du deinen Mailserver lokal hast, kommt da localhost hin, aber ich denke mal nicht, dass du so einen hast ^^
                                Also das, was du als pop-Server bekommst. Heißen auch manchmal pop.host.domain, oder pop3.host.domain, der eben nur mail.host.domain, füg einfach das ein, was du hast XD


                                Auf jeden Fall kan die das was wir hier besprochen haben auch nicht steht zumindest in der TODO "TODO: MIME Mails and Attachment"
                                Ach vergiss das einfach mal...
                                IMO gehört das gar nicht in die Klasse rein, das muss das "RestSkript" machen.

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

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

                                Comment

                                Working...
                                X