Guma: PHP->HTML-Mail->mit Textversion und einem PDF als Attachment

Hallo zusammen, ich will eine Mail versenden, die neben der HTML-Version auch einen Text anzeigt (falls das mailprogramm HTML nicht erlaubt). Das klappt auch gut. Jetzt soll noch ein Attachment dazu. Die Mail soll ein PDF als Anhang bekommen. Das bekomme ich leider nicht sauber hin. So sieht mein Ansatz aus:

 $Header = "MIME-Version: 1.0\r\n";  
 $Header .= "From: Context Referenten <mustarmann@mee.com>\n";  
 $Header .= "Reply-To: mustarmann@mee.com\n";  
 $Header .= "Return-Path: noreply@" .$_SERVER['SERVER_NAME']. "\r\n";  
 $Header .= "Message-ID: <" .time(). " noreply@" .$_SERVER['SERVER_NAME']. ">\r\n";  
  
 $Header .= "X-Mailer: PHP v" .phpversion(). "\r\n";  
 $Header .= "Content-Type: multipart/alternative;boundary=" . $boundary . "\r\n";  
 $Header .= "\r\n";  
  
  // Textversion anhängen  
  
 $mailmessage = "$textVersion";  
 $mailmessage .= "\r\n\r\n--" . $boundary . "\r\n";  
 $mailmessage .= "Content-type: text/plain;charset=utf-8\r\n\r\n";  
 $mailmessage .= "Sie erhalten die Mail als reine Textversion, da Ihr Mail-Programm kein HTML zul&auml;sst. $textVersion";  
 $mailmessage .= "\r\n\r\n--" . $boundary . "\r\n";  
 $mailmessage .= "Content-type: text/html;charset=utf-8\r\n\r\n";  
 $mailmessage .= "$alltext";  
 $mailmessage .= "\r\n\r\n--" . $boundary . "--";  
  
  
 // Attachment anhängen  
	$mailmessage .= "--" .$trenner. "\r\n";  
	$mailmessage .= "Content-Type: image/jpeg; name=\"" .$uploadname. "\"\r\n";  
	$mailmessage .= "Content-Transfer-Encoding: base64\r\n";  
	$mailmessage .= "Content-Disposition: attachment; filename=\"" .$uploadname. "\"\r\n\r\n";  
	$mailmessage .= chunk_split( base64_encode( file_get_contents( $_FILES['datei']['tmp_name'] ) ) );  
	$mailmessage .= "\n";  
	

Hilfe ist willkommen, Grüße Guma.

  1. Hallo,

    Hallo zusammen, ich will eine Mail versenden, die neben der HTML-Version auch einen Text anzeigt (falls das mailprogramm HTML nicht erlaubt).

    das ist gut, denn wenn man schon Mails im HTML-Format verschickt, sollte man *grundsätzlich* eine Plaintext-Version als Alternative bieten.

    Das klappt auch gut. Jetzt soll noch ein Attachment dazu. Die Mail soll ein PDF als Anhang bekommen. Das bekomme ich leider nicht sauber hin.

    Du gehst davon aus, dass du das PDF-Attachment im Quelltext einfach hinten anhängen kannst. Das ist aber ein Trugschluss. Man muss die korrekte Schachtelung der Mail-Bestandteile (HTML, Text, Anhang) und deren MIME-Typen beachten, denn sobald eine Mailnachricht mehr als nur Text enthält, muss man die Einzelteile in "Container" verpacken.

    Das sieht schematisch dargestellt so aus:

    Container multipart/alternative
         Textversion text/plain
         HTML-Versein text/html
      Container Ende

    Falls das PDF eine dritte, inhaltlich gleiche Alternative ist, könnte man es in den vorhandenen Container einfügen. Ich verstehe dich aber so, dass das PDF etwas Zusätzliches ist, das nicht anstatt des Textinhalts gelesen werden soll.

    Du hast jetzt einfach noch etwas hinten drangeklatscht, obwohl der Container schon beendet ist. Stattdessen musst du die Struktur "aufbohren", denn du hast jetzt eine zweifach geschachtelte Struktur: Der äußere Container enthält zuerst den bisherigen Container mit Text und HTML, und dann noch das PDF. Also ungefähr so:

    Container multipart/mixed
         Container multipart/alternative
            Textversion text/plain
            HTML-Versein text/html
         Container Ende
         PDF-Dokument application/x-pdf
      Container Ende

    $mailmessage = "$textVersion";

    Einen String nochmal in einen String einbetten? Wer macht denn sowas?

    $mailmessage .= "Sie erhalten die Mail als reine Textversion, da Ihr Mail-Programm kein HTML zul&auml;sst. $textVersion";

    Was hat &auml; hier zu suchen, wenn es doch gar kein HTML ist?

    $mailmessage .= "$alltext";

    Einen String nochmal in einen String einbetten? Wer macht denn sowas?

    // Attachment anhängen
    $mailmessage .= "--" .$trenner. "\r\n";
    $mailmessage .= "Content-Type: image/jpeg; name="" .$uploadname. ""\r\n";
    $mailmessage .= "Content-Transfer-Encoding: base64\r\n";
    $mailmessage .= "Content-Disposition: attachment; filename="" .$uploadname. ""\r\n\r\n";
    $mailmessage .= chunk_split( base64_encode( file_get_contents( $_FILES['datei']['tmp_name'] ) ) );
    $mailmessage .= "\n";

    Das ist für sich genommen okay, nur wie angesprochen, muss das *in* den äußeren Container hinein. Übrigens hast du im einleitenden Text von einem PDF als Anhang gesprochen, hier gibst du aber plötzlich image/jpeg als MIME-Type an - wie passt das zusammen?

    Ciao,
     Martin

    --
    Lehrer:  Wieviel ist die Hälfte von 8?
    Schüler: Kommt drauf an. Waagrecht 0 und senkrecht 3.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Danke Martin,
      für deine ausführliche Beschreibung. Ich dachte  mir schon, dass ich die Container fehlerhaft gesetzt habe. Ich gehe jetzt neu ran und setze es entsprechend um.
      Grüße Guma

  2. Hallo,

    Hallo zusammen, ich will eine Mail versenden, die neben der HTML-Version auch einen Text anzeigt (falls das mailprogramm HTML nicht erlaubt). Das klappt auch gut. Jetzt soll noch ein Attachment dazu. Die Mail soll ein PDF als Anhang bekommen. Das bekomme ich leider nicht sauber hin. So sieht mein Ansatz aus:

    warum bentutzt du nicht eine/die PEAR-Klasse(n) zum Mailen oder die Mail-Klasse vom Zend Framework?

    Gruß

    jobo