Probleme mit e-Mails

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

  • Probleme mit e-Mails

    Hallo!

    Ich versuch es doch mal, weil mir eine Suche im Forum und auch die Suche im Internet bislang nichts gebracht haben.

    Ich möchte gern mittels PHP e-Mails von einem POP3-Postfach abrufen und auslesen. Dies habe ich bisher auch (wenn auch modifiziert) hinbekommen.
    Nun stehe ich vor dem Problem, dass eine Mail ja auch über Anhänge verfügen kann und ich diese gern nicht nur anzeigen lassen (wenn möglich, also bei einem Bild bspw.), sondern auch - wenn es mehrere sind - einzeln auf diese zugreifen und diese abspeichern möchte.

    Die IMAP-Funktionen sind mir IMHO soweit bekannt, dass ich obiges bereits geschafft habe, jedoch bereiten mir die Mailanhänge sehr viele Schwierigkeiten. Ich weiß leider nicht, wie ich....
    1. überprüfen lassen kann, ob eine Mail über Attachments verfügt oder nicht.
    2. diese dann anzeigen - geschweige denn abspeichern kann.

    Mit imap_fetchstructure und co. bin ich bis dato leider nicht weitergekommen. Ferner gibt es darüber wenig in Foren und im gesamten Netz - teilweise sind IMAP-Funktionen bei php.net gar nicht oder nur unzureichend dokumentiert.


    Lange Rede, kurzer Sinn: Könnte vielleicht jemand so nett sein und mir vielleicht etwas konkreter nahelegen, wie ich mein Problem lösen könnte?


    Vielen Dank schonmal im Voraus
    Geht nich, gibts nich!
    God is real...unless declared as integer!

  • #2
    Versuchen kann man es ja mal.
    PHP-Code:
    // irgendwie mußt du $mbox belegen ...
    // und $msgno ... solltest du alles schon haben
    $struct imap_fetchstructure($mbox,$msgno);
    $contentParts count($struct->parts);
    if (
    $contentParts >= 2) {
        for (
    $i=2$i<=$contentParts$i++) {
            
    $att[$i-2] = imap_bodystruct($mbox$msgno$i);
            if (
    $att[$i-2]->parameters[1]->value != "") {
                 echo 
    '<a href="download.php?msg='.$msgno.'&att='.($i-2).'">'
                    
    .$att[$i-2]->parameters[1]->value.'</a><br>';
            }    
        }

    download.php:
    PHP-Code:
    // irgendwie mußt du $mbox belegen ...
    // und für $att das selbe Spiel wie oben ...
    $attName $att[$_GET['att']]->parameters[0]->value;
    $attType strrev(substr(strrev($attName), 04));
    $attContent imap_fetchbody($mbox$_GET['msg'], $_GET['att']+2);

    switch (
    $attType) {
        case 
    '.avi'$ctype 'video/avi'; break;
        case 
    '.doc'$ctype 'application/msword'; break;
        case 
    '.zip'$ctype 'application/zip'; break;
        case 
    '.xls'$ctype 'application/vnd.ms-excel'; break;
        case 
    '.gif'$ctype 'image/gif'; break;
        case 
    '.jpg':
        case 
    'jpeg'$ctype 'image/jpeg'; break;
        case 
    '.wav'$ctype 'audio/wav'; break;
        case 
    '.mp3'$ctype 'audio/mpeg3'; break;
        case 
    '.mpg':
        case 
    'mpeg'$ctype 'video/mpeg'; break;
        case 
    '.rtf'$ctype 'application/rtf'; break;
        case 
    '.htm':
        case 
    'html'$ctype 'text/html'; break;
        
    /* weitere Content-Types nach Belieben */
        
    default: $ctype 'application/octet-stream';
    }   
    header ('Content-Type: '.$ctype); 
    header ("Content-Disposition: attachment; filename=$attName; size="
        
    .(strlen($attContent)-1).';'); 
        
    if (
    substr($ctype04) == 'text') {
        echo 
    imap_qprint($attContent);
    } else {
        echo 
    imap_base64($attContent);

    Völlig ungetestet.
    Zuletzt geändert von onemorenerd; 12.07.2006, 19:35.

    Kommentar


    • #3
      Hey vielen Dank erst einmal.....


      nachdem ich das ausprobiert habe, hab ich doch die ein oder andere Frage dazu - selbst, wenn du ja gesagt hattest, es wäre komplett ungetestet.

      PHP-Code:
      $contentParts count($struct->parts); 
      Wenn ich eine e-Mail komplett ohne Anhänge schicke, habe ich 0 parts.
      Wenn ich eine e-Mail mit einem Anhang schicke, habe ich 2 parts.
      Wenn ich eine e-Mail mit 2 Anhängen schicke, habe ich 3 parts usw...

      Woher kommt denn der Sprung zwischen 0 und 2 parts und was bedeutet denn "parts" in dem Sinne eigentlich? Die Trennung zwischen dem Text und dem Anhang kann es ja nicht sein, oder?
      Zuletzt geändert von chefkochbln; 13.07.2006, 09:22.
      Geht nich, gibts nich!
      God is real...unless declared as integer!

      Kommentar


      • #4
        Hoi,

        zu Parts könnt ich dir sagen, dass eine Email mit Attachment eine mulitpart/mixed Mail ist (steht im Header). Die Teile(=Parts: text, html-text, attachments) sind mit einer "Boundary" voneinander getrennt.

        Ich könnte mir vorstellen, dass 0 bedeutet, eine Mail OHNE mulitpart/mixed. Warum da jetzt ein Sprung drin ist, sorry, weiß ich nicht.

        so far...

        Kommentar


        • #5
          Hmm......

          also bis jetzt konnte ich mir den Body der Mail auslesen lassen. Dann habe ich so etwas wie das:

          This is a multi-part message in MIME format.
          --------------090405090708000100020506
          Content-Type: text/html; charset=ISO-8859-15
          Content-Transfer-Encoding: 8bit


          Hier steht der Text der E-Mail

          --------------090405090708000100020506
          Content-Type: image/jpeg;
          name="logo.JPG"
          Content-Transfer-Encoding: base64
          Content-Disposition: inline;
          filename="logo.JPG"

          /9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAASUkqAAgAAAABAABRBAABAAAAAAAAAAAA
          AAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcp
          LDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIy
          MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABRAOsDASIAAhEBAxEB/8QA
          HwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQID
          AAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6
          Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
          p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QA
          HwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAEC
          AxEEB************BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5
          OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOk
          paanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oA

          ........
          Kann ich denn mit dem Buchstabengewäsch etwas anfangen? Ich bin ja der Meinung, es handelt sich um den Anhang, der lediglich codiert ist.
          Also wenn ihr mir da zustimmt, dann könnte man doch rein theoretisch aus dem Body den Dateinamen bekommen, den codierten Anhang in einer Datei speichern (die Dateiendung kennt man ja dann) und dann irgendwie als Datei ausgeben, oder was meint ihr??

          Klingt eventuell ziemlich umständlich - gerade auch, wenn mehrere Dateien angehangen sind - aber eine Möglichkeit wäre es doch oder??
          Geht nich, gibts nich!
          God is real...unless declared as integer!

          Kommentar


          • #6
            Kann ich denn mit dem Buchstabengewäsch etwas anfangen?
            Das ist das Attachment, das mit base64_encode() vor dem Versenden bearbeitet wurde. Wenn du jetzt dieses Datengewurstel sauber rausschneidest, base64_decode() drüber lässt und als logo.jpg speicherst, dann hast du das Attachment wie gewünscht.

            Gruss

            tobi
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              kannst als alternative ein webmail programm anschauen dh danach googeln, da es anscheinend kein php modul gibt, welches email 'entschlüsselt' (kein phpmailer hoch -1). zb ilohamail, beemailphp, unter horde gibt es auch eines.

              die theoretischen grundlagen sind in einigen rfcs, 2822, 2821, 1521 (letzteres irrtum vorbehalten). Ich denke das selbständige decodieren gemäss den normen ist in einigen Tagen selbstprogrammiert dh nicht so riesig.

              der sprung von null nach zwei erklärt sich damit, dass ohne attachments das mail kein multipart ist, mit attachment ist es ein multipart.

              Kommentar


              • #8
                Hey danke erst einmal für die Antworten.

                @jahlives:
                Hm, das hilft mir weiter - vielen Dank. Ich werd das mal morgen ausprobieren - heute fehlt mir gänzlich die Lust *lach*

                @mäander_:
                Gegooglet hab ich die letzten Tage *lach* - und ich finde, dass viele PHP-Mailclients aufwendig programmiert worden sind oder gar eigene IMAP-Klassen implementiert haben, bei denen man dann kaum noch durchsteigt.

                Ich habe jedoch einen Link gefunden (hab ich leider auf Arbeit gespeichert), in dem jemand genau die Vorgehensweise mit Quellcode beschreibt und da bin ich vorhin schon etwas weiter gekommen. Ich probier das mal morgen aus und zur Not muss ich halt versuchen alles zu zerschnippel und mir da was überlegen.

                Wie auch immer - vielen Dank erst einmal.
                Ich hoffe, es klappt alles soweit - wenn nicht würd ich mich gern nochmal melden....
                Geht nich, gibts nich!
                God is real...unless declared as integer!

                Kommentar


                • #9
                  So...ich poste hier nochmal den Link, den ich im Post darüber angesprochen hatte.
                  Er funktioniert tabellos, Kevin Steffer spricht mir nebenbei bemerkt vollkommen aus der Seele *gg*
                  hier klicken

                  Auch die von ihm angesprochenen Snippets funktionierern bis auf ganz kleine Korrekturen super! - Das einzige Problem was sich nur noch stellt ist die Tatsache, dass ein Attachment (nehmen wir an, es ist eine .GIF-Datei) halt als "Quellcode" angezeigt wird und leider nicht als Bild an sich.

                  Aber ich bin weiter am probieren, wie man das umgehen, bzw. lösen kann.
                  Geht nich, gibts nich!
                  God is real...unless declared as integer!

                  Kommentar


                  • #10
                    Original geschrieben von jahlives
                    Das ist das Attachment, das mit base64_encode() vor dem Versenden bearbeitet wurde. Wenn du jetzt dieses Datengewurstel sauber rausschneidest, base64_decode() drüber lässt und als logo.jpg speicherst, dann hast du das Attachment wie gewünscht.
                    Hmm....wird jede Mail mit 64bit codiert? - Okay, das ist eine rhetorische Frage. Ich hatte das mal bei einer Mail ausprobiert, den Text komplett sauber abgeschnitten (wie in dem angeführten Beispiel) und dann den Inhalt in die entsprechende Datei (test.jpg) geschrieben.
                    Bei der Anzeige musste ich jedoch feststellen, dass das ganze nicht geklappt hat - also bei der Codierung nochmal nachgeschaut und da musste ich feststellen, dass diese Mail mit 8bit codiert wurde.
                    Content-Type: text/html; charset=ISO-8859-15
                    Content-Transfer-Encoding: 8bit
                    Wird denn jede Mail, die ich bspw. vom Mailclient Thunderbird verschicke gleich codiert? - Also mal anders formuliert: Ist die Codierung abhängig von dem benutzten Mailclient oder wonach richtet sich das?


                    Sorry für das Nachfragen, aber bislang bin ich durch eure Tips schon ziemlich weit gekommen *grml* - ein kleiner Schritt fehlt mir halt noch, bis das Ergebnis technisch mal ein wenig funktioniert :-)

                    Danke!!
                    Geht nich, gibts nich!
                    God is real...unless declared as integer!

                    Kommentar


                    • #11
                      Genaugenommen ist es in aller Regel vom Absender bzw. dessen Mailclient abhängig, denn der schnürt die Mail zusammen. Jeder MTA auf dem Weg in deine Inbox darf zwar Attachments de- und wieder (anders) encodieren, ohne gegen irgendein RFC zu verstoßen. Aber das macht natürlich keiner außer vielleicht dem letzten in der Kette, der die Mail vorm Speichern in deiner Inbox auf Spam prüfen möchte.

                      Ist auch völlig egal, wie was verpackt wurde. In den Headers steht, wie man es auszupacken hat - hast du ja hier schon zweimal gepostet. Mehr mußt du nicht wissen.

                      Mein Ansatz da oben war insofern auch an der Realität vorbei, denn es hat absolut nichts zu sagen, welchen Dateityps ein Attachment ist.
                      Zuletzt geändert von onemorenerd; 15.07.2006, 20:38.

                      Kommentar


                      • #12
                        Hey danke für die schnelle Antwort.... klingt wohl doch so, als ob sich das ganze ein wenig komplizierter gestaltet. Deiner Antwort zufolge müsste man ja dann bei jeder eintreffenden Mail prüfen, wie sie codiert wird und dann die einzelnen Anhänge (wenn mehrere vorhanden) erst einmal temporär speichern und dann von Mail zu Mail ggf. ne andere Codierungsmethode wählen.....

                        Naja, hat ja keiner behauptet, dass es 'n leichter Weg wäre

                        Trotzdem danke!!



                        Ach ja, btw: Aber einzelne, bzw. mehrere Anhänge sind nicht unterschiedlich codiert, ne? Also pro Mail bestimmte Codierung, ne? (Nur nochmal, um sicher zu gehen)
                        Geht nich, gibts nich!
                        God is real...unless declared as integer!

                        Kommentar


                        • #13
                          Original geschrieben von chefkochbln
                          Ach ja, btw: Aber einzelne, bzw. mehrere Anhänge sind nicht unterschiedlich codiert, ne? Also pro Mail bestimmte Codierung, ne? (Nur nochmal, um sicher zu gehen)
                          Doch, das kann sein. Jedes Attachment einer Mail kann anders kodiert sein.
                          Aber der Programmieraufwand hält sich in Grenzen: Header fischen, analysieren und das geeignete Decoding anwenden. Also explode, irgendwas mit preg_* und ein switch.

                          Kommentar

                          Lädt...
                          X