mail inline pics

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

  • mail inline pics

    Hi alle

    hab wieder ein problemchen. hab jetzt wochenlang alles versucht und gelesen und... und es will immernoch nicht richtig funzen... anscheinend überseh ich etwas oder kapiers eifach nicht.

    ich versuch inline-bilder in einer html-mail anzuzeigen. outlook, opera, hotmail packen's ohne problem. doch netzkappe und thunderbird packen die bilder im attachment. gmx zeigt die bilder nirgendwo an. mein code sieht inzwischen, nachdem ich alles aufs minimum reduziert habe (und getestet), folgendermasse aus:


    PHP-Code:
    $grenze="--JA_NE_GRENZE";

    $headers ="MIME-Version: 1.0\n";
    $headers.="From: [email]blabla@blabla.bla[/email]\n";
    $headers.="Content-Type: multipart/related;\n\tboundary=$grenze\n";
    $headers.="Content-Disposition:inline\n";
    $headers.="\n--$grenze\n";

    $headers.="Content-Type: text/html;charset=\"iso-8859-1\"\n";
    $headers.="Content-Transfer-Encoding: 8bit\n\n";
    $headers.= "$body";

    for (
    $i=0;$i<$counter;$i++) {
        
    $headers.="\n--$grenze\n";
        
    $headers.="Content-ID: <$element[$i]>\n";
        
    $headers.="Content-Type: image/jpeg; name=".$element[$i]."\n";
        
    $headers.="Content-Transfer-Encoding: base64\n";
        
    $headers.="Content-Disposition: inline\n\n";
        
    $zeiger_auf_datei=fopen($dir."/".$element[$i],"rb");
        
    $inhalt_der_datei=fread($zeiger_auf_datei,filesize($dir."/".$element[$i]));
        
    fclose($zeiger_auf_datei);
        
    $contents=chunk_split(base64_encode($inhalt_der_datei));
        
    $headers.=$contents;
    }
    $headers.="--$grenze--";
    if (
    mail($mail"VORSCHAU: $subject""$headers)) {
        
    $msg "Die Vorschau wurde verschickt!";
        } else {
        
    $msg "Die Vorschau konnte nicht verschickt werden!";

    $body = ein haufen tabellen etc. und der img-tag sieht so aus:
    <img src='cid:".$row["p4pic"]."' border='0' align='left'>

    Ich verzweifle!
    Vielen Dank für die Hilfe

  • #2
    Salut

    ich tippe mal drauf, dass etwas mit den Zeilenschlägen nicht stimmt. Ich habe mir selbst so ein Ding gebastelt, das die Mails sauber als im HTLM-Format verschickt.

    Ganz wichtig ist, dass du nach der letzten Boundary 2 mal einen Zeilenschlag machst.

    Ich frage mich gerade, ob allenfalls der Zeilenschlag vor

    $headers.="\n--$grenze\n";
    der Fehler sein könnte.

    Auch müsste der Content Type im Header auf multipart gesetzt werden. Du kannst dann im Header des jeweiligen Bodies sagen, ob es text oder html ist.

    Ich schau mal bei mir zu Hause (komme von hier nicht an den Code) was ich anders gemacht habe.

    Hoffe du hast noch etwas Geduld
    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


    • #3
      Hey Jahlive

      Vielen Dank! Habs mit den Zeilenschlägen versucht... hat nichts gebracht.

      wenn du bei dir nachgucken könntest wäre das super! ich seh da nix mehr. hab mir den code soviel mal angesehen, soviele kombinationen ausprobiert... naja, ich versuchs trotzdem noch selbst weiter... schon mal danke!

      ich bin mir auch fast sicher das es mit irgend einem \n oder \t oder -- zu tun hat. pfff ich weiss nicht mehr was ich schon alles schon versucht habe. hab das gefühl ich gehe im kreis...

      Kommentar


      • #4
        pfff ich weiss nicht mehr was ich schon alles schon versucht habe. hab das gefühl ich gehe im kreis...
        Das kenn ich in diesem Zusammenhang zu Genüge Habe mir für mein Register-Script, die Mail-Bestätigung mit Bild gebaut und war auch ver... lange dran ehe ich es zum laufen gekiegt habe.
        Es lag dann an den Zeilenschlägen...

        Also ich poste später mal den Code von mir...

        Cheers

        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


        • #5
          Original geschrieben von jahlives


          Also ich poste später mal den Code von mir...
          super-cool!

          Kommentar


          • #6
            Salut Sauron

            also hier der Code, wie er bei mir auf einem Linux-Basierten Server läuft. Wichtig sind folgende Punkte:

            1. Jede Zeile in $headers und in $nachricht (nur dort wo $nachricht header-Daten enthält!) muss mit einem Zeilenschlag \r\n beendet werden.

            2. Der Content-Type in $headers MUSS

            Content-Type: multipart/mixed;boundary=\"$boundary\"\r\n";

            sein.

            3. Die letzte Zeile in $headers MUSS mit doppeltem Zeilenschlag beendet werden \r\n\r\n

            4. $nachricht MUSS mit der $boundary eingeleitet werden (\r\n nicht vergessen )

            5. Der Code des Bildes darf maximal 76 Zeichen pro Zeile lang sein --> chunk_split() benutzen

            6. image/jpeg ist wirklich korrekt

            7. Die letzte Boundary MUSS --boundary--\r\n\r\n lauten

            und zu guter Letzt:

            mail() mit dem Schalter -f funzt nur im Zusammenspiel mit sendmail d.h. Unix / Linux (er sollte dafür sorgen, dass der Return-Path im Header der mail entsprechend angepasst wird)


            Ich hoffe, dass war irgendwie verständlich. Wie gesagt bei mir funzt es. Also einfach probieren...



            PHP-Code:

            $sender 
            "webmaster@tobisworld.ch";
                
            $betreff "Deine Registrierung bei TobisWorld.ch";
                
            $boundary "=_XXXboundaryXXX";
                
            $headers "From: TobisWorld<$sender>\r\n";
                
            $headers.= "Reply-To: Info <info@tobisworld.ch>\r\n";
                
            $headers.= "Priority: urgent\r\n";
                
            $headers.= "Precedence: first-class\r\n";
                
            $headers.= "MIME-Version: 1.0\r\n";
                
            $headers.= "Content-Type: multipart/mixed;boundary=\"$boundary\"\r\n";
                
            //$headers.= "boundary=\"$boundary\";\r\n";
                
            $headers.= "Content-Transfer-Encoding: 8bit\r\n\r\n";
                
                
            $nachricht "--$boundary\r\n";
                
            $nachricht.= "Content-Type: text/html; charset=\"iso-8859-1\";\r\n";
                
            $nachricht.= "Content-Transfer_Encoding: 8bit\r\n\r\n";
                
            $nachricht.= "<html><head><title></title></head><body>Vielen Dank für Deine Registrierung bei <b>TobisWorld</b><br><br><br>
                Dein Benutzername ist <font color=\"#E2810E\" size=\"+2\">
            $user_name</font> und das Passwort 
                <font color=\"#E2810E\" size=\"+2\">
            $pw</font>.<br> Bitte beachte, dass die Passworte in der DB verschlüsselt gespeichert 
            werden, daher besteht bei Verlust dieses Mails und Vergessens
            des Passwortes keine M&ouml;glichkeit mehr dieses irgendwie
            herauszufinden.<br><br>
            Zum Abschluss musst du innert 12 h via diesen Link die Richtigkeit deiner Email Adresse bestätigen.<br>
            <ahref=\"http://www.tobisworld.ch/scripts_php/register/register_complete.php?
            $idmail\">
            [url]http://www.tobisworld.ch/scripts_php/register/register_complete.php
            ?[/url]
            $idmail</a><br><br><br> 
            Wenn diese Registrierung nicht durchgeführt hast, brauchst du nichts weiter zu unternehmen. Der Account wird dann gelöscht.<br>
            Du kannst den Account aber unter diesem Link auch direkt löschen <a href=\"http://www.tobisworld.ch/scripts_php/etc/clean_up.php
            ?
            $idmail\">[url]http://www.tobisworld.ch/scripts_php/etc/clean_up.php
            ?[/url]
            $idmail</a><br><br>

            Vielen Dank und viel Spass wünscht Dir<br><br>Webmaster TobisWorld<br><br>
            $sender</body></html>\r\n";

                
            $nachricht.= "--$boundary\r\n";
                
                
                
            //Bushpic anhängen
                
            mt_srand((double)microtime() * 1000000);
                
            $array_bild mt_rand(1,175);
                
            $bild file_get_contents("../../gallery/pics/politics/bush/pics$array_bild.jpg");
                
            $bild_64 base64_encode($bild);
                
            $bild_64 chunk_split($bild_64,76,"\r\n");
                
                
            $nachricht.= "Content-Type: image/jpeg; name=\"bild.jpg\"\r\n";
                
            $nachricht.= "Content-Transfer-Encoding: base64\r\n";
                
            $nachricht.= "Content-ID: bild.jpg\r\n\r\n";
                
            $nachricht.= "$bild_64\r\n";
                
            $nachricht.= "--$boundary--\r\n\r\n";
                
                

                
            mail ($email$betreff$nachricht$headers,"-f [email]info@tobisworld.ch[/email]"); 


            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
              Hi Tobi!

              Merci viiil mol :-)

              Also, bei mir funktionnierte deine Variante nicht. \r brauche bzw. darf ich bei mir nicht schreiben, obwohl ich auch einen Linux-Server benutze. So kommt bei mir gar nichts mehr an. Das hatte ich schon mal festgestellt. Liegt an der Konfiguration.

              Trotzdem hab ichs doch noch hingekriegt... ich habe den code ganz neu geschrieben, aber es lag dann doch noch an etwas ganz anders... ich hatte für die html tags einfache anführungszeichen benutzt, also ' anstatt ". jetzt funktionnierts wunderbar! also trotzdem hier noch der neue code, inkl. das was ich für den ersten post rausgestrichen hatte.

              PHP-Code:
              $firstb="FIRST-BOUNDARY";
              $secondb="SECOND-BOUNDARY";

              $headers ="MIME-Version: 1.0\n";
              $headers.="From: [email]blablabla@blablabla.bla[/email]\n";
              $headers.="Content-Type: multipart/alternative;\n\tboundary=\"$firstb\"\n\n";
              $headers.="This is a multi-part message in MIME format.\n";
              $headers.="--$firstb\n";
              $headers.="Content-Type: text/plain; charset=us-ascii; format=flowed\n";
              $headers.="Content-Transfer-Encoding: 7bit\n\n";        
              $headers.="".strip_tags($text)."\n\n";
              $headers.="--$firstb\n";
              $headers.="Content-Type: multipart/related;\n\tboundary=\"$secondb\"\n\n";
              $headers.="--$secondb\n";
              $headers.="Content-Type: text/html; charset=us-ascii\n";
              $headers.="Content-Transfer-Encoding: 7bit\n\n";
              $headers.="$body\n\n";
              for (
              $i=0;$i<$counter;$i++) {
                  
              $headers.="--$secondb\n";
                  
              $headers.="Content-Type: image/jpeg;\n\tname=\"$element[$i]\"\n";
                  
              $headers.="Content-Transfer-Encoding: base64\n";
                  
              $headers.="Content-ID: <$element[$i]>\n";
                  
              $headers.="Content-Disposition: inline;\n\t";
                  
              $headers.="filename=\"$element[$i]\"\n\n";
                  
              $zeiger_auf_datei=fopen($dir."/".$element[$i],"rb");
                  
              $inhalt_der_datei=fread($zeiger_auf_datei,filesize($dir."/".$element[$i]));
                  
              fclose($zeiger_auf_datei);
                  
              $contents=chunk_split(base64_encode($inhalt_der_datei), 76"\n");
                  
              $headers.="$contents";
              }
              $headers.="--$secondb--\n\n";
              $headers.="--$firstb--";
              if (
              mail($mail$subject ""$headers)) {
                  
              $msg "Mail wurde verschickt!";
                  } else {
                  
              $msg "Mail konnte nicht verschickt werden!";

              $text = unformatierter text
              $body = html, text, dieses mal mit doppelte anführungszeichen in den Tags (und alt text bei img )

              Grüsse aus Basel
              Sauron

              Kommentar


              • #8
                Salut Sauron

                cool, dass es jetzt bei dir auch funzt. Der RFC-Standart für mails verlangt so viel ich weiss, dass du nach jeder Zeile im Header einen CRLF (Carriage Return/Line Feed) machst, also \r\n.
                Warum das jetzt bei Dir nicht nötig ist, verstehe ich echt nicht, aber solange es funzt...

                Gruss

                tobi

                P.S. für den entsprechenden RFC kannst du hier schauen
                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


                • #9
                  \r machts bei mir anscheinend automatisch...?! check ich auch nicht. wie gesagt ich denke das liegt an der php-konfig.
                  guck dir mal das hier an:

                  PHP-Code:
                  $contents=chunk_split(base64_encode($inhalt_der_datei), 76"\n"); 
                  musste ... "\n" extra spezifizieren ansonten bekomm ich immer eine leerzeile beim codierten bild! also sowas

                  aösdfhgaöohfoöasdhf.....

                  asdfhasjdhfjkasdhf...

                  asdfkjsldkflskdjf

                  naja ob das für die bilddarstellung etwas ausmacht weiss ich jetzt nicht habs nicht getestet. zumindest wusste ich dann, dass \r bei mir nicht nötig ist...

                  gruss
                  Zuletzt geändert von sauron343; 14.09.2004, 18:36.

                  Kommentar

                  Lädt...
                  X