T-Rex: php mail attachment

Moin,

Das Thema ist mir etwas peinlich, da egal welches Tutorial ich lese am Anfang immer steht "das ist total einfach".

Versuch
1. Hab mir vor einigen Jahren eine eigene Mail Klasse geschrieben. Die läuft soweit auch ganz gut, kann bislang aber keine Anlagen mitschicken. Da ich genau dies aber aktuell brauche hab ich die Gelegenheit beim Schopf gepackt und wollte die Klasse erweitern. Als alles scheiterte dachte ich, ich seh den Wald vor lauter Bäumen nicht mehr.

2. Deshalb hab ich ein einfaches Script im Internet gesucht. Hab sogar eins gefunden. Das war für Idioten gemacht. 4 Variablen wo man Absender, Empfänger und Anlage definieren muss. Dann sollte das Script funktionieren. Die mail() Funktion hat immer noch kein true zurück gegeben.

3. Also dachte ich mir, vielleicht hat das Script ja doch einen Fehler drin (obwohl der Abgleich mit anderen Tutorials und der PHP Dokumentation auf keine Fehler deuten lies). Wollte dann aber doch etwas "Professionelles". Deshalb hab ich dann die PHPMailer Klasse runter geladen. Die wird ua. bei Wordpress benutzt. Die MUSS ja funktionieren dachte ich mir. Also Tutorials durchgelesen wie das funktioniert, initialisiert, aufgerufen ... nix.

Jetzt die doofe Frage ob man den Webserver so konfigurieren könnte, dass Attachments nicht funktionieren?
Oder gibts da eine php.ini Einstellung?
Oder bin ich echt zu doof für das Thema?!?
Hat vielleicht jemand ein Script für mich, dass 100% läuft?

Ich steh auf jeden Fall auf dem Schlauch, wie lange nicht mehr...

Gruß
im Kreis drehender und laut "Gummibär" rufender
T-Rex

  1. Hallo,

    [...] Die mail() Funktion hat immer noch kein true zurück gegeben.

    das kann unterschiedliche Gründe haben:
     * kein MTA installiert oder nicht konfiguriert (vor allem auf Windows-Testsystemen)
     * nicht erlaubte zusätzliche Headerzeilen, z.B. ungültige oder nicht zulässige Absenderadresse
     * fehlende, aber vom System geforderte zusätzliche Headerzeilen, z.B. Absenderadresse

    Jetzt die doofe Frage ob man den Webserver so konfigurieren könnte, dass Attachments nicht funktionieren?

    Nein. Ob mit oder ohne Attachment - was man an mail() übergibt, ist immer nur einfach ein String. Das Attachment steckt meistens als base64-codierter Block darin. Und mail() kümmert sich nicht um den Inhalt, unterscheidet also nicht nach Anhang.
    Funktionierte denn der Versand ohne Anhang? Wenn ja, hast du noch etwas anderes geändert als nur den message-String?

    Oder gibts da eine php.ini Einstellung?

    Nicht dass ich wüsste.

    Oder bin ich echt zu doof für das Thema?!?

    Nein, ganz bestimmt nicht.
    Zeig doch mal den Ausschnitt des Scripts, der für die Mail-Aufbereitung zuständig ist. Und prüfe anhand von Kontrollausgaben unmittelbar vor mail(), welche Werte die Parameter $recipient, $subject und $extra_headers haben. Versuche herauszufinden, ob dein Webhoster bestimmte Parameter zwingend verlangt.

    So long,
     Martin

    --
    Zwei Kumpels sitzen vor dem Computer. "Welche Suchmaschine benutzt du eigentlich meistens?" - "Prima Vera." - "Hmm, kenn' ich gar nicht." Dann geht die Tür auf: "Schatz ich habe deine Sonnenbrille wiedergefunden!" - "Prima, Vera!"
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Danke Martin dass du mir zur Seite stehst.

      Also das ganze mal Stück für Stück. Der Folgende Code funktioniert:

      $mail_header = "From: $von";  
      /* boundary */  
      $boundary = strtoupper(md5(uniqid(time())));  
        
      /* MIME-mail-header */  
      $mail_header .= "\nMIME-Version: 1.0";  
      $mail_header .= "\nContent-type: multipart/mixed; boundary=$boundary";  
      
      

      Die Mail wird abgeschickt. Ist natürlich leer...
      Supi denk ich mir und möchte einfach nur Text dazu hängen:

      $mail_header = "From: $von";  
      /* boundary */  
      $boundary = strtoupper(md5(uniqid(time())));  
        
      /* MIME-mail-header */  
      $mail_header .= "\nMIME-Version: 1.0";  
      $mail_header .= "\nContent-type: multipart/mixed; boundary=$boundary";  
        
      /* Hier faengt der normale Mail-Text an */  
      $mail_header .= "\n--$boundary";  
      $mail_header .= "\nContent-type: $content_type_s";  
      $mail_header .= "\nContent-Transfer-Encoding: 8bit";  
      $mail_header .= "\n\n$mail_content";  
      $mail_header .= "\n--$boundary--";  
      
      

      Der Code erzeugt folgende Ausgabe bei mir:

      From: info@example.org  
      MIME-Version: 1.0  
      Content-type: multipart/mixed; boundary=8DF9D748182045668798A9321F491541  
      --8DF9D748182045668798A9321F491541  
      Content-type: text/plain  
      Content-Transfer-Encoding: 8bit  
        
      ist der eigentliche mailtext (html-text)  
      --8DF9D748182045668798A9321F491541--  
      
      

      Sieht eigentlich Gesund aus. Aber allein das funktioniert nicht :(.

      Gruß
      $%§&$&§/*#*"§4§$"§$
      T-Rex

      1. Hi,

        Danke Martin dass du mir zur Seite stehst.

        naja, ich kann doch nicht tatenlos danebensitzen, wenn ich vielleicht helfen könnte. ;-)

        $mail_header = "From: $von";

        /* boundary */
        $boundary = strtoupper(md5(uniqid(time())));

        /* MIME-mail-header */
        $mail_header .= "\nMIME-Version: 1.0";
        $mail_header .= "\nContent-type: multipart/mixed; boundary=$boundary";

        
        >   
        > Die Mail wird abgeschickt. Ist natürlich leer...  
          
        Und kommt auch an? Okay.  
          
        
        > Supi denk ich mir und möchte einfach nur Text dazu hängen:  
          
        Eigentlich ja, mit den nötigen boundaries und lokalen Headerzeilen wie Content-Type und Content-Transfer-Encoding.  
          
        
        > ~~~php
        
        $mail_header = "From: $von";  
        
        > /* boundary */  
        > $boundary = strtoupper(md5(uniqid(time())));  
        >   
        > /* MIME-mail-header */  
        > $mail_header .= "\nMIME-Version: 1.0";  
        > $mail_header .= "\nContent-type: multipart/mixed; boundary=$boundary";  
        >   
        > /* Hier faengt der normale Mail-Text an */  
        > $mail_header .= "\n--$boundary";
        
        

        Da ist ein Problem: Zwischen den globalen Headern und dem ersten boundary muss eine Leerzeile stehen (also zwei \n in Folge).

        $mail_header .= "\nContent-type: $content_type_s";

        $mail_header .= "\nContent-Transfer-Encoding: 8bit";
        $mail_header .= "\n\n$mail_content";
        $mail_header .= "\n--$boundary--";

          
        Der Rest sieht für meine Augen korrekt aus.  
          
        
        > ~~~html
        
        From: info@example.org  
        
        > MIME-Version: 1.0  
        > Content-type: multipart/mixed; boundary=8DF9D748182045668798A9321F491541  
        > --8DF9D748182045668798A9321F491541  
        > Content-type: text/plain  
        > Content-Transfer-Encoding: 8bit  
        >   
        > ist der eigentliche mailtext (html-text)  
        > --8DF9D748182045668798A9321F491541--
        
        

        Sieht eigentlich Gesund aus.

        Bis auf die fehlende Leerzeile. Die bewirkt, dass das erste boundary noch zum Header gerechnet wird, und ein mit "--" beginnender Mail-Header ist ungültig. Dass mail() deswegen aber das Handling verweigert, wundert mich schon ...

        Übrigens: Deine Angewohnheit, die Newline-Zeichen \n am Zeilenanfang der Folgezeile zu notieren, ist relativ ungewöhnlich. Typisch ist eigentlich, dass man sie am Zeilenende notiert. Ist zwar im Endeffekt egal, bloß eine Sache der Darstellung, aber mich verwirrt's und macht das Lesen etwas schwieriger.

        So long,
         Martin

        --
        Ordnung schaffen heißt, das Eigelb vom Dotter zu trennen.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Danke Martin.

          Hab die neue Zeile eingefügt. Das ist übrigens nicht mein Script. Es ist (wie in Versuch 2 beschrieben) sehr einfach aufgebaut und ich hoffe dadurch mein Problem besser beschreiben und am Ende auch verstehen zu können.

          Die Ausgabe sieht jetzt so aus:

          From: info@example.org  
          MIME-Version: 1.0  
          Content-type: multipart/mixed; boundary=9730DB6F5399040F3F2CECEC6B87F68F  
            
          --9730DB6F5399040F3F2CECEC6B87F68F  
          Content-type: text/plain  
          Content-Transfer-Encoding: 8bit  
            
          ist der eigentliche mailtext (html-text)  
          --9730DB6F5399040F3F2CECEC6B87F68F--
          

          Mailversand ist immer noch false.
          Vielleicht probier ich mit den Leerzeilen noch ein wenig rum... ich stochere jedoch im Nebel.

          Gruß
          im Kreis drehender, laut "Gummibär" rufender und sich dabei auf den Kopf schlagender
          T-Rex

          1. Hallo T-Rex,

            Content-type: multipart/mixed; boundary=9730DB6F5399040F3F2CECEC6B87F68F

            ich habe das gerade mal mit real existierenden Mails in meinem Posteingang verglichen, weil ich keinen Fehler mehr erkenne. Dabei Fällt mir auf, dass der boundary-String in dieser Headerzeile, wo er deklariert wird, immer in Anführungszeichen steht, also:

            Content-Type: multipart/mixed; boundary="9730DB6F5399040F3F2CECEC6B87F68F"

            Ob das so sein _muss_, weiß ich nicht, aber einen Versuch wär's noch wert.
            Andernfalls gehen mir nämlich auch die Ideen aus.

            So long,
             Martin

            --
            Man soll den Tag nicht vor dem Abend loben.
            Und den Mann nicht vor dem Morgen.
              (alte Volksweisheit)
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Danke Martin!

              Ich hab die Lösung!
              http://webcheatsheet.com/PHP/send_email_text_html_attachment.php

              Das war das Vorbild.
              Was mir hier aufgefallen ist (und das hast du auch schon geschrieben), der Header und der Inhalt werden getrennt.
              Am Ende werden $headers und $message (mit Anhang) getrennt in die mail Funktion geworfen. Hab das adaptiert und es funktioniert :).

              Also so funktioniert es:
              mail( $to, $subject, $message, $headers );
              So (oder so ähnlich) nicht!
              mail( $to, $subject, "", $headers."\n".$message );

              Ich hab immer wieder gelesen (z.B. Hier), dass man ruhig alles in den Header reinschreiben kann. Darf man aber anscheinend nicht.
              Die Frage ist jetzt wieso nicht?
              Ist das eine PHP Sache oder ein Mailserver Einstellung?

              Gruß
              nicht mehr im Kreis, aber trotzdem noch Gummibär rufender
              T-Rex

              1. Hallo,

                Danke Martin!

                "da nich für." :-)

                Was mir hier aufgefallen ist (und das hast du auch schon geschrieben), der Header und der Inhalt werden getrennt.
                Am Ende werden $headers und $message (mit Anhang) getrennt in die mail Funktion geworfen. Hab das adaptiert und es funktioniert :).

                Also so funktioniert es:
                mail( $to, $subject, $message, $headers );
                So (oder so ähnlich) nicht!
                mail( $to, $subject, "", $headers."\n".$message );

                Das überrascht mich, weil ich beide Varianten schon angeblich funktionierend gesehen habe, und weil PHP meines Wissens nichts anderes macht, als die beiden Teile zusammenzukleben. Allerdings ist in e-Mail-Headern das vorgeschriebene Zeilenende-Zeichen nicht ein einzelnes Linefeed \n, wie in der Unix-Welt üblich, sondern die Kombination \r\n, als CR+LF. PHP versucht zwar, einzelne \n durch \r\n zu ersetzen, ersetzt aber möglicherweise auch \n\n nur durch _ein_ \r\n-Compound.
                Warum ist mir das im ersten Posting nicht aufgefallen?

                Ich hab immer wieder gelesen (z.B. Hier), dass man ruhig alles in den Header reinschreiben kann. Darf man aber anscheinend nicht.
                Die Frage ist jetzt wieso nicht?

                Auch nicht mit \r\n getrennt?

                Ciao,
                 Martin

                --
                Kriege kennen keinen Gewinner. Es gibt nur Verlierer und das sind wir.
                  (Hotti)
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                1. Da ich Felix Rat folgen möchte, möchte ich dir an dieser Stelle mitteilen dass ich mir gerne die Mühe machen würde deinen Test nachzuvollziehen, mein Script aktuell aber andere Baustellen hat und ich es deshalb nicht so einfach umbauen kann.

                  Wäre natürlich Klasse, wenn du mir auch dabei helfen könntest.

                  Es geht immer noch um den Attachment. Dieser wird im großen erfolgreich mit der Mail verschickt. Es handelt sich dabei wie ich schon durchblicken lies um eine vcard. Diese wird sogar von meinem Thunderbird erkannt *YEAH!*. Dass doofe ist, dass die VCard Text enthält und dieser Text kann unter Umständen aus Umlauten bestehen.

                  Das hat zur Folge das die vCard-Notiz (wo die Umlaute vornehmlich sind) ua. so aussieht:
                  "tats=C3=A4chlich" (tatsächlich)

                  Der PHP Code sieht an der Stelle so aus ($fileContent ist ein utf8 String):
                  $strAttachment .= chunk_split(base64_encode($fileContent)).PHP_EOL;

                  und hat folgenden Header:

                  Content-Type: text/x-vcard; name="vcard.vcf"  
                  Content-Transfer-Encoding: base64  
                  Content-Disposition: attachment; filename="vcard.vcf"  
                  
                  

                  Hab auch schon versucht den Header auf iso zu stellen - ohne Erfolg. Eventuell hat Thunderbird auch einen Fehler. Hab schon mal ein Thema überflogen wo stand, das Thunderbird ohne ein Plugin keine vcard könnte. Deshalb wundert es mich generel wieso mein Thunderbird das kann.

                  Hoffe ich hab das Problem ausführlich beschrieben!?

                  Gruß
                  wieder langsam rotierender
                  Gummibär ähhh... T-Rex

                  1. Hallo,

                    Wäre natürlich Klasse, wenn du mir auch dabei helfen könntest.

                    ich gebe mir Mühe.

                    Es geht immer noch um den Attachment. Dieser wird im großen erfolgreich mit der Mail verschickt. Es handelt sich dabei wie ich schon durchblicken lies um eine vcard. Diese wird sogar von meinem Thunderbird erkannt *YEAH!*. Dass doofe ist, dass die VCard Text enthält und dieser Text kann unter Umständen aus Umlauten bestehen.

                    Gut. Im Kontext e-Mail haben wir zwei Codierungen, die wir beachten müssen. Da wäre zum einen die Zeichencodierung (character encoding oder auch charset), die uns auch im Web-Kontext auf Schritt und Tritt begleitet. Dazu kommt aber noch die Transfercodierung (Transfer encoding), die aus historischen Gründen den Einschränkungen der übermittelnden Stationen Rechnung tragen soll. Ich weiß nicht, ob das heute wirklich noch relevant ist, aber es gab Systeme im Mail-Verkehr, die nur 7bit-Codes übertragen konnten.

                    Deswegen wurden Codierungen eingeführt, die die auftretenden 8bit-Werte so umcodieren, dass nur noch Bytewerte im Bereich 0..0x7F vorkommen, also 7bit. Das entspricht dem ASCII-Zeichensatz.

                    Das hat zur Folge das die vCard-Notiz (wo die Umlaute vornehmlich sind) ua. so aussieht:
                    "tats=C3=A4chlich" (tatsächlich)

                    Der Text ist also zunächst in UTF-8 codiert, das ä wird durch die Bytes 0xC3, 0xA4 dargestellt. Danach wurde die Transfercodierung Quoted-Printable angewendet. Die macht nichts anders, als diejenigen Bytewerte, die nicht direkt verarbeitet werden dürfen (also 0x80 und höher) als zweistellige Hex-Zahl in den Text zu schreiben und ein '=' davorzusetzen. Es gibt nur zwei Sonderregeln: a) Damit auch ein echtes '=' dargestellt werden kann, muss dieses Zeichen als =3D geschrieben werden; b) ein '=' am Zeilenende zeigt an, dass der folgende Zeilenumbruch *nicht* Teil der Nutzdaten ist.
                    Die andere populäre Transfercodierung ist base64, das immer päckchenweise drei Bytes auf vier ASCII-Zeichen abbildet.

                    Der PHP Code sieht an der Stelle so aus ($fileContent ist ein utf8 String):
                    $strAttachment .= chunk_split(base64_encode($fileContent)).PHP_EOL;

                    Huch - da wird base64 verwendet, eine ganz andere Transfercodierung. Dann muss die Quoted-Printable-Codierung schon vorher irgendwo passiert sein. Beides zusammen ergibt natürlich wenig Sinn.

                    und hat folgenden Header:

                    Content-Type: text/x-vcard; name="vcard.vcf"

                    Content-Transfer-Encoding: base64
                    Content-Disposition: attachment; filename="vcard.vcf"

                      
                    Deshalb wird vom Mailclient (T-Bird) die base64-Codierung erkannt und decodiert, vom zusätzlichen Quoted-Printable weiß er nichts und hält das daher für Klartext.  
                      
                    
                    > Hab auch schon versucht den Header auf iso zu stellen - ohne Erfolg. Eventuell hat Thunderbird auch einen Fehler. Hab schon mal ein Thema überflogen wo stand, das Thunderbird ohne ein Plugin keine vcard könnte.  
                      
                    Da bin ich mir im Moment nicht sicher, aber selbst wenn er vCard nicht kennt, müsste er die Daten immer noch als XML-ähnlichen Code mit normal lesbarem Textinhalt darstellen.  
                      
                    
                    > Hoffe ich hab das Problem ausführlich beschrieben!?  
                      
                    Ja. Nur führt deine Beschreibung auf die Schlussfolgerung, dass "irgendwo" die zu übermittelnden Daten noch Quoted-Printable codiert werden, bevor die Anweisung im oben zitierten Codeauszug zum Zuge kommt. Mach mal 'ne Kontrollausgabe von $fileContent vor dieser Anweisung - ich fürchte, dass da schon "tats=C3=A4chlich" drinsteht. Dann müsstest du in der Verarbeitungskette Schritt für Schritt zurückgehen, um das Schweinerle zu finden.  
                      
                    
                    > Gruß  
                    > wieder langsam rotierender  
                    > Gummibär ähhh... T-Rex  
                      
                    Ruhig, Brauner! Gaaanz ruhig ...  
                    Ciao,  
                     Martin  
                    
                    -- 
                    Nein, es ist nicht wahr, dass bei der Post Beamte schneller befördert werden als Pakete.  
                    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                    
                    1. Wow das ist allerdings Mühe. Ich glaub durch dein Posting merke ich mir jetzt auch endlich mal woran ich Quoted-Printable erkenne.

                      Aber leider ergibt sich wieder ein Mysterium.
                      Ich hab mir gedacht bevor ich da sonstwas mit der Codierung untersuche, schreibe ich die Inhalte direkt in die Variable:

                      $fileContent = <<< content  
                      BEGIN:VCARD  
                      VERSION:4.0  
                      NOTE:tatsächlich  
                      END:VCARD  
                      content;  
                      $strAttachment .= chunk_split(base64_encode($fileContent)).PHP_EOL; 
                      

                      An der Ausgabe ändert das nichts.
                      Der übertragene Wert (also $fileContent) hat den base64 Wert von:
                      QkVHSU46VkNBUkQNClZFUlNJT046NC4wDQpOT1RFOnRhdHPDpGNobGljaA0KRU5EOlZDQVJE

                      Wenn ich den Wert wieder zurück übersetze, erhalte ich wieder den Urpsrung:
                      base64_decode( "QkVHSU46VkNBUkQNClZFUlNJT046NC4wDQpOT1RFOnRhdHPDpGNobGljaA0KRU5EOlZDQVJE" );

                      Ergibt:

                      BEGIN:VCARD  
                      VERSION:4.0  
                      NOTE:tatsächlich  
                      END:VCARD  
                      
                      

                      Klingt alles ganz logisch was du sagst. Aber meine Tests ergeben, dass die Erde doch Flach ist...

                      Wie wärs, wenn ich das ganze nicht in base64 sondern gleich in Quoted-Printable sende?

                      Gruß
                      Gummibär...
                      T-Rex

                      1. HMPF.... hab mir gerade eine vcard von meinem eigenen Thunderbird Account zugeschickt, also nicht über php.

                        Rate mal...
                        Auch da sind die Umlaute kaputt. Scheint also ein Thunderbird Problem zu sein.
                        Da kann man natürlich lange suchen.

                        So Martin, ich hab keinen Bock mehr. Den ganzen Tag im Nebel stochern und wahnwitzigen Einstellungen hinterher jagen macht müde. Ich geh heim.
                        Morgen teste ich für dich dann die \n\r Sache.

                        Vielleicht finde ich ja eine Möglichkeit die Codierung beim vcard einlesen irgendwie um zu stellen oder sowas.

                        Danke für deinen Beistand und für deine Hilfe ! Gilt für die anderen natürlich genau so, aber für Martin ganz besonders!

                        Gruß
                        Sonnenbrille aufsetzender und Fahrradhandschuhe anziehender
                        T-Rex

                        1. Hallo,

                          HMPF.... hab mir gerade eine vcard von meinem eigenen Thunderbird Account zugeschickt, also nicht über php.

                          guter Gedanke. Ich hab das mal nachgestellt, deine minimale vcard-Datei als Beispiel genommen. Die vcard-Datei als Attachment angehängt, Mail an mich selbst verschickt. T-Bird hat keine Möglichkeit, die Zeichencodierung der vcard-Datei zu erkennen, und gibt daher auch selbst keine an. Als Transfercodierung wählt er 8bit, also praktisch uncodiert. Die erzeugte Mailnachricht sieht im Quelltext so aus:

                          [einige Headerzeilen gekürzt]  
                          User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130329 Thunderbird/17.0.5  
                          MIME-Version: 1.0  
                          To: self@kennst.net  
                          Subject: vcard  
                          Content-Type: multipart/mixed;  
                           boundary="------------080207090301020805000304"  
                            
                          This is a multi-part message in MIME format.  
                          --------------080207090301020805000304  
                          Content-Type: text/plain; charset=ISO-8859-1; format=flowed  
                          Content-Transfer-Encoding: 7bit  
                            
                            
                          --------------080207090301020805000304  
                          Content-Type: text/directory;  
                           name="dummy.vcf"  
                          Content-Transfer-Encoding: 8bit  
                          Content-Disposition: attachment;  
                           filename="dummy.vcf"  
                            
                          BEGIN:VCARD  
                          VERSION:4.0  
                          NOTE:tatsächlich  
                          END:VCARD  
                            
                            
                          --------------080207090301020805000304--
                          

                          Man erkennt, dass T-Bird auch noch eine leere Textnachricht als ersten Part mit reinpackt, und da einfach mal von ISO-8859-1 ausgeht (Defaulteinstellung), während er für das vcard-Attachment auf die Angabe einer Codierung verzichtet (es war in Wirklichkeit UTF-8). Die fehlerhafte Darstellung rührt aber daher, dass er bei der Anzeige wegen der fehlenden Codierungs-Angabe wieder von ISO-8859-1 ausgeht.

                          Auch da sind die Umlaute kaputt. Scheint also ein Thunderbird Problem zu sein.

                          Ja und nein. Es ist sendeseitig ein T-Bird-Problem, aber die Sendeseite ersetzt du ja mit deinem Script, das eigentlich vollständige Angaben macht.

                          Morgen teste ich für dich dann die \n\r Sache.

                          Andersrum: Nicht \n\r, sondern \r\n.
                          Morgen bin ich allerdings erst am späten Abend *vielleicht* am Rechner.

                          Gruß
                          Sonnenbrille aufsetzender und Fahrradhandschuhe anziehender
                          T-Rex

                          Mein Beileid. Es ist immer noch unangenehm warm. Und dann noch radfahren, wo einem sowieso die Brühe in Strömen über Stirn, Nacken und Rücken runterläuft?
                          Naja, wer's mag ...

                          Schönen Abend noch,
                           Martin

                          --
                          Wieso heißen die Dinger eigentlich Anrufbeantworter? Eigentlich sind es doch nur Anrufanhörer.
                          Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                          1. Tja da haben sich die Test erledigt.
                            Wie Sven schon erwähnte, macht das Soshu-dings Plugin für php die Sache zu nichte. Und genau das ist bei der Domain aktiv.

                            Die Umlaute Probleme ignorier ich auch einfach mal. Mein Chef macht etwas druck, dass das Projekt fertig wird (das alte Thema, in 10 Minuten Facebook nachprogrammieren, geht den das?). Der Kunde dem wir das zuschicken hat Outlook. Also hoffen wir dass Outlook keine Probleme mit den Umlauten bzw. mit der Codierung hat.

                            Ich halte dich auf dem laufenden.

                            Gruß
                            laufender Halter
                            T-Rex

                      2. Hallo Gummibär, ;-)

                        Ich hab mir gedacht bevor ich da sonstwas mit der Codierung untersuche, schreibe ich die Inhalte direkt in die Variable:

                        $fileContent = <<< content

                        BEGIN:VCARD
                        VERSION:4.0
                        NOTE:tatsächlich
                        END:VCARD
                        content;
                        $strAttachment .= chunk_split(base64_encode($fileContent)).PHP_EOL;

                          
                        hm, da kann ja nun wirklich nichts schiefgehen.  
                          
                        
                        > Der übertragene Wert (also $fileContent) hat den base64 Wert von:  
                        > `QkVHSU46VkNBUkQNClZFUlNJT046NC4wDQpOT1RFOnRhdHPDpGNobGljaA0KRU5EOlZDQVJE`{:.language-html}  
                        >   
                        > Wenn ich den Wert wieder zurück übersetze, erhalte ich wieder den Urpsrung:  
                        > `base64_decode( "QkVHSU46VkNBUkQNClZFUlNJT046NC4wDQpOT1RFOnRhdHPDpGNobGljaA0KRU5EOlZDQVJE" );`{:.language-php}  
                        >   
                        > Ergibt:  
                        > ~~~html
                        
                        BEGIN:VCARD  
                        
                        > VERSION:4.0  
                        > NOTE:tatsächlich  
                        > END:VCARD  
                        > 
                        
                        

                        Okay. Das ist soweit alles noch nachvollziehbar. Und trotzdem kommt am Ende =C3=A4 raus? That's Voodoo.

                        Wie wärs, wenn ich das ganze nicht in base64 sondern gleich in Quoted-Printable sende?

                        Auch möglich. Du könntest sogar versuchen, Transfer-Encoding: 8bit zu verwenden, was letzten Endes eine 1:1-Übertragung ohne jegliche Codierung wäre. Aber ich find's doch mysteriös, wo die zusätzliche Codierung bei dir herkommt. Magst du mal eine der Problem-Testmails zur Forensik an meine Mailadresse senden? Und zusätzlich nochmal den exakten verwendeten Code entweder hier posten oder ebenfalls per Mail?
                        Es wäre echt peinlich, wenn wir am Ende wirklich keine andere Erklärung haben, als dass es bei dir spukt.

                        So long,
                         Martin

                        --
                        Die letzten Worte des stotternden Beifahrers:
                        Frei... frei... frei... freilich kommt da was!!
                        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      2. Hallo nochmal,

        $mail_header = "From: $von";

        /* boundary */
        $boundary = strtoupper(md5(uniqid(time())));

        /* MIME-mail-header */
        $mail_header .= "\nMIME-Version: 1.0";
        $mail_header .= "\nContent-type: multipart/mixed; boundary=$boundary";

        /* Hier faengt der normale Mail-Text an */
        $mail_header .= "\n--$boundary";
        $mail_header .= "\nContent-type: $content_type_s";
        $mail_header .= "\nContent-Transfer-Encoding: 8bit";
        $mail_header .= "\n\n$mail_content";
        $mail_header .= "\n--$boundary--";

          
        noch etwas finde ich hier auffällig: Warum übergibst du den gesamten Mail-Body als $mail\_header? Kann man zwar machen, wenn man das mit der trennenden Leerzeile beachtet und dafür den Parameter $message beim Aufruf von mail() als Leerstring übergibt. Ist aber eigentlich nicht so gedacht.  
          
        Ciao,  
         Martin  
        
        -- 
        In Ägypten haben früher 150000 Leute 35 Jahre lang an einer Pyramide gearbeitet. Aber bei uns arbeiten doppelt so viele Leute doppelt so lange allein an der Baugenehmigung.  
          (Dieter Nuhr, deutscher Kabarettist)  
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        
        1. Joa der String ist leer.
          Also aktuell möchte ich an dem Code nur lernen. Später kann man das sicherlich optimieren. Den Text erstmal per "Anhang" zu verschicken finde ich den einfachsten Anhang.
          Später möchte ich dann eine in einem String vorhandene vCard in den Anhang packen.

          Gruß
          kleine Schritte gehender
          T-Rex

        2. Moin!

          noch etwas finde ich hier auffällig: Warum übergibst du den gesamten Mail-Body als $mail_header? Kann man zwar machen, wenn man das mit der trennenden Leerzeile beachtet und dafür den Parameter $message beim Aufruf von mail() als Leerstring übergibt. Ist aber eigentlich nicht so gedacht.

          Die Suhosin-Extension (das Security-Addon für PHP) verhindert, dass man auf diese Weise Content in den Mailheadern überträgt.

          Sofern Suhosin installiert ist (phpinfo weiß mehr), dürfte dieses Vorgehen also scheitern. Man sollte es mindestens deshalb unbedingt vermeiden.

          - Sven Rautenberg

  2. hi,

    Das Thema ist mir etwas peinlich, da egal welches Tutorial ich lese am Anfang immer steht "das ist total einfach".

    Isses auch. Guck Dir an, wie eine MIME-Mail aufgebaut ist und dann kriegst Du das auch hin mit den Attachments.

    Versuch

    1. Hab mir vor einigen Jahren eine eigene Mail Klasse geschrieben. Die läuft soweit auch ganz gut, kann bislang aber keine Anlagen mitschicken.

    Grundwissen: Das E in MIME steht für Extension. D.h., eine Mail mit Attachment ist immer noch eine Datei die mit einem Text-Editor gelesen werden kann (einfach ausgedrückt).

    Da ich genau dies aber aktuell brauche hab ich die Gelegenheit beim Schopf gepackt und wollte die Klasse erweitern. Als alles scheiterte dachte ich, ich seh den Wald vor lauter Bäumen nicht mehr.

    Nunja, den Begriff boundary kennst Du ja schon ;)

    1. Deshalb hab ich ein einfaches Script im Internet gesucht.

    Lass die Sucherei. Erweitere Dein Grundwissen, dann kommt eine Klasse dabei raus, die Dir immer wieder Freude macht.

    Oder gibts da eine php.ini Einstellung?

    Für die mail()-Funktion schon. Aber warum sich davon abhängig machen? Schick Deine Mail doch einfach selbst auf sendmail, Stichwort popen().

    Hat vielleicht jemand ein Script für mich, dass 100% läuft?

    Auf meinem Blog habe ich Einiges betreff Mailversand geschrieben.

    Hotti

  3. Tach!

    1. Hab mir vor einigen Jahren eine eigene Mail Klasse geschrieben. Die läuft soweit auch ganz gut, kann bislang aber keine Anlagen mitschicken. Da ich genau dies aber aktuell brauche hab ich die Gelegenheit beim Schopf gepackt und wollte die Klasse erweitern. Als alles scheiterte dachte ich, ich seh den Wald vor lauter Bäumen nicht mehr.

    Möchtest du nur üben, oder warum versuchst du dieses bereits gelöste Problem noch einmal zu lösen?

    dedlfix.