kostenloser Webspace werbefrei: lima-city


PHP mail header-contents

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Hi,
    anchdem ich nun versucht habe ein Bild in eine html mail via php einzubinden, und zwar ohne es im Anhang mitzuliefern, muss ich sagen dass ich total gescheitert bin.

    Ich würde gerne nur den Code des Bildes senden, nicht das Bild irgendwie im Anhang oder es aus dem Web nehmen.
    Soweit hat der Thread starke Ähnlichkeit mit http://www.lima-city.de/thread/php-mail-mit-bild

    Auf meiner Suche habe ich verschiedene Header-Contents kennengelernt. Was ich jetzt zusammengesetzt habe.
    <?php
    $header .= "MIME-Version: 1.0";
    $header .= "From: xx@xxx.de";
    $header .= "Reply-To: xx@xxx.de";
    $header .= "Content-Type: multipart/alternative; boundary=bordmark";
    $header .= "Content-Disposition: inline";
    
    $content .= "--bordmark";
    $content .= "Content-Type: multipart/mixed; boundary=bordmark2";
    
    $content .= "--bordmark2";
    $content .= "Content-Type: image/png; name=\"code.png\"";
    $content .= "Content-Transfer-Encoding: base64";
    $content .= "Content-ID: <1234code4321>";
    $content .= "Content-Disposition: inline; filename=\"code.png\"";
    $content .= "iVBORw0KGgoAAAANSUhEUgAAAH0AAAA8AQMAAABxSievAAAABl BMVEUAAAD///+l2Z/dAAAAZUlE
     QVQokWP4jwp+MPy/UuruEnvx4kXxUtlC8VGBwSuAEXPUELi994zxnO+W2+ECzy33r8 3OunYeLnB4
     7/pMv9dX2hEq9k4vXZ+96zySGdv+vs6uQ5jxX+Lc5znfJKnr0lEB CgUAKk/49NHFmtcAAAAASUVO
     RK5CYII=";
    
    $content .= "--bordmark2";
    $content .= "Content-Type: text/html;charset=\"iso-8859-15\"";
    $content .= "Content-Transfer-Encoding: quoted-printable";
    
    $content .= <<<html
    <html>
        <body>
            <div align="center">
                <h1>Auftrag Nr. 1167993029</h1>
                <img src="cid:1234code4321" align="right"><br>
            </div>
            <br>
            <br>
            ...hier folgen diverse HTML-Zeilen...
        </body>
    </html>
    html;
    
    $content .= "--bordmark";
    $content .= "Content-Type: text/plain;charset=\"iso-8859-15\"";
    $content .= "Content-Transfer-Encoding: quoted-printable";
    
    $content .= "Hier steht der Plaintext...";
    $content .= "--bordmark";
    
    
    $x = mail("xx@xxx.de","Test_mail",$content,$header);
    
    echo "Sendestatus: $x";
    ?>


    Leider haut er mir jetzt den ganzen Text so wie er ist um die Ohren (also einfach nur eine Ausgabe der $content Variable aber ohne dabei die Header und bordmarker zu beachten, wobei ich mir bei denen sowieso nicht so sicher bin)

    Ich hoffe Ihr könnt mir damit weiterhelfen.
    MFG
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo programtools,

    was verstehst Du denn unter 'nur den Code'. Im wesentlichen gibt es drei Möglichkeiten:
    - Das Bild ist verlinkt -> aus dem Web
    - Das Bild ist "sichtbar" in die E-Mail eingebettet -> normaler Anhang
    - Das Bild ist "unsichtbar" in die E-Mail eingebettet -> wird bei manche Mail-Programmen trotzdem als Anhang angezeigt.

    Edit:
    Ich habe den Code vom anderen Thread jetzt mal korrigiert (Fall 3):
    <?php
     // Setting a timezone, mail() uses this.
     date_default_timezone_set('Europe/Berlin');
      // recipients
     $to  = "<Bitte E-Mail einfügen>";
    
      // subject 
     $subject = "Test for Embedded Image"; 
    
     // Create a boundary string.  It needs to be unique 
     $sep = sha1(date('r', time()));
    
     // Add in our content boundary, and mime type specification:  
     $headers .= "Content-Type: multipart/mixed;";
     $headers .= " boundary=\"PHP-mixed-{$sep}\"\r\n";
    
     // additional headers
     $headers .= "To: <Bitte E-Mail einfügen>\r\n"; 
     $headers .= "From: darkpandemic@lima-city.de \r\n"; 
    
     $inline = chunk_split(base64_encode(
               file_get_contents('http://www.lima-city.de/images/avatar/mopC2En5gzQF5eO.jpeg')));
    
     // Your message here:
     $body = "--PHP-mixed-{$sep}\r\n";
     $body .= "Content-Type: multipart/alternative;";
     $body .= " boundary=\"PHP-alt-{$sep}\"\r\n\r\n";
     $body .= "--PHP-alt-{$sep}\r\n";
     $body .= "Content-Type: text/plain\r\n\r\n";
     $body .= "Hai, It's me!\r\n";
     $body .= "--PHP-alt-{$sep}\r\n";
     $body .= "Content-Type: multipart/related;";
     $body .= " boundary=\"PHP-related-{$sep}\"\r\n\r\n";
     $body .= "--PHP-related-{$sep}\r\n";
     $body .= "Content-Type: text/html\r\n\r\n";
     $body .= "<html><head><title>Test HTML Mail</title></head>";
     $body .= "<body><font color='red'>Hai, it is me!</font>Here is my picture: ";
     $body .= "<img src=\"cid:PHP-CID-{$sep}\" /></body></html>\r\n";
     $body .= "--PHP-related-{$sep}\r\n";
     $body .= "Content-Type: image/jpeg\r\n";
     $body .= "Content-Transfer-Encoding: base64\r\n";
     $body .= "Content-ID: <PHP-CID-{$sep}>\r\n\r\n";
     $body .= $inline;
     $body .= "--PHP-related-{$sep}--\r\n";
     $body .= "--PHP-alt-{$sep}--\r\n";
     $body .= "--PHP-mixed-{$sep}--";
    
     // Finally, send the email 
     mail($to, $subject, $body, $headers);
     
     ?>
    Wenn Du überall dort, wo <Bitte E-Mail einfügen> steht Deine E-Mail-Adresse reinschreibst, dann solltest Du meinen Avatar als E-Mail bekommen ;-)

    Beitrag zuletzt geändert: 12.9.2011 22:26:12 von darkpandemic
  4. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Leider nicht.
    Ich habe folgende Ausgabe:

    Content-Type: multipart/mixed; 
         boundary="PHP-mixed-43e0d45b104c929a387a52a3c720ebb038e47c37"To: You <xx@xxx.de>
    From: Me <system@moontec.de>
    Reply-To:
    
     --PHP-mixed-43e0d45b104c929a387a52a3c720ebb038e47c37
     Content-Type: multipart/alternative; 
                   boundary="PHP-alt-43e0d45b104c929a387a52a3c720ebb038e47c37"
    
     --PHP-alt-43e0d45b104c929a387a52a3c720ebb038e47c37
     Content-Type: text/plain
    
     Hai, It's me!
    
    
     --PHP-alt-43e0d45b104c929a387a52a3c720ebb038e47c37
     Content-Type: multipart/related; boundary="PHP-related-43e0d45b104c929a387a52a3c720ebb038e47c37"
    
     --PHP-alt-43e0d45b104c929a387a52a3c720ebb038e47c37
     Content-Type: text/html
    
     <html>
     <head>
     <title>Test HTML Mail</title>
     </head>
     <body>
     <font color='red'>Hai, it is me!</font>
     Here is my picture: 
      <img src="cid:PHP-CID-43e0d45b104c929a387a52a3c720ebb038e47c37" />
     </body>
     </html>
     
     --PHP-related-43e0d45b104c929a387a52a3c720ebb038e47c37
     Content-Type: image/gif
     Content-Transfer-Encoding: base64
     Content-ID: <PHP-CID-43e0d45b104c929a387a52a3c720ebb038e47c37> 
     
     
    
     --PHP-related-43e0d45b104c929a387a52a3c720ebb038e47c37--
     
     --PHP-alt-43e0d45b104c929a387a52a3c720ebb038e47c37--
    
     --PHP-mixed-43e0d45b104c929a387a52a3c720ebb038e47c37
     Content-Type: application/zip; name="attachment.zip"
     Content-Transfer-Encoding: base64
     Content-Disposition: attachment
    
     
    
    
     --PHP-mixed-43e0d45b104c929a387a52a3c720ebb038e47c37--


    Also ignoriert er einfach alles und gibts direkt aus.

    Beitrag zuletzt geändert: 13.9.2011 11:58:41 von programtools
  5. Hallo programtools,

    das ist aber nicht die Ausgabe von meinem Script (das habe ich auf dem Lima-Server erfolgreich getestet).
    Der erste Fehler ist schon in der 1./2. Zeile. Vor 'boundary=...' darf nämlich kein Zeilenumbruch sein. Vor 'To:' muss einer sein und zwar einer mit '\r\n'. Andere zählen nicht. Das selbe gilt für den ersten mixed Abschnitt.
    Im zweiten alt-Abschnitt ist der nächste Fehler (Separator vor 'Content-Type: text/html'). Da dieser vom Typ multipart/related ist muss man darin auch den related-Seperator und nicht den alt-Separator benutzen. Sofern Du es nicht absichtlich rausgenommen hast fehlt auch der Oktet-Stream für das Bild, der sollte im zweiten related-Abschnitt sein.
    Den zweiten mixed-Abschnitt mit dem Anhang brauchst Du gar nicht. Es sei denn, Du willst wirklich einen Anhang mitschicken.

    Wichtig sind auf jedenfall die Zeilenumbrüche. Nach jedem Seperator/Header kommt genau einmal '\r\n'. Nach dem Seperator/Header-Block muss ein zusätzliches '\r\n' eingefügt werden, da die erste Zeile nach diesem Block ignoriert wird.
    Desweiteren muss es auch ein '\r\n' sein. Ein '\n' oder '\r' alleine gilt nicht.

    Beitrag zuletzt geändert: 13.9.2011 13:08:02 von darkpandemic
  6. Autor dieses Themas

    programtools

    programtools hat kostenlosen Webspace.

    Ja, tut mir leid. Alles klappt. Ich hatte das Problem, dass ich die Dateien erst umbenennen musste, da er sie sonst noch aus dem cache geladen hatte. Demnach war das ein veralteter und falscher Code. Dennoch Danke für die Fehleranalyse, das macht mir das Verstehen um einiges einfacher.

    Dein Beispiel klappt problemlos. Was mich jetzt noch interessieren würde, ist was passiert, wenn der Empfänger keine HTML-E-mails verarbeiten kann. Wird dann nur der plain Text angezeigt und das Bild ignoriert? (nicht dass man dann einen kryptischen Salad bekommt :D )

    MFG und vielen Dank.
  7. Hallo programtools,

    normalerweise sollte bei E-Mail-Clients ohne HTML-Anzeige der text/plain-Abschnitt angezeigt werden. Der multipart/related-Abschnitt sollte eigentlich vollkommen unter den Tisch fallen. Nur normale Anhänge sollten trotzdem verfügbar sein.
    Allerdings kann ich das alles nicht sicher sagen, da ich keinen Mail-Client benutze der kein HTML versteht.
    Selbst Konsolen-Clients schaffen es mittlerweile HTML irgendwie darzustellen. Bilder sind dort natürlich keine zu sehen aber der Oktet-Stream wird auch nicht angezeigt.
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!