PHP - E-Mail mit Anhang

gwittmann

Grünschnabel
Hallo,

leider funktionieren bei puretec die Klassen phpmailer nicht.

Deshalb versuche ich mit einer anderen Funktion E-Mails per PHP-Skript zu versenden.

Mit einem Anhang klappt das auch wunderbar.

Bei zwei Anhängen hängt er entweder nur eines an oder hängt leere Textdateien mit an.

Der Aufruf:
PHP:
	$datei[1] = "rechnungen/LS_MjAyMDAwMzg2Nw==.pdf";
	$datei[2] = "http://www.tutorials.de/forum/images/logo3.png";
	$dateiname[1] = "123.pdf";
	$dateiname[2] = "456.png";
	
	MailVersenden("info@gwittmann.de", '', '', "info@gwittmann.de", "Test", "Ich will\r\n\r\ntesten!!\r\n\r\n\"ENDE\"", $datei, $dateiname);


Die Funktion:
PHP:
function MailVersenden($an, $cc, $bcc, $from, $betreff, $text, $datei, $dateiname) {

     $email_subject = $betreff; // The Subject of the email
 
 //        $email_to = ""; // Who the email is too
 
     $headers = "From: ".$from;
 
 
 
     $semi_rand = md5(time());
     $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
 
     $headers .= "\nMIME-Version: 1.0\n" .
                 "Content-Type: multipart/mixed;\n" .
                 " boundary=\"{$mime_boundary}\"";
 
     $email_message .=  "This is a multi-part message in MIME format.\n\n" . 
	 					"--{$mime_boundary}\n" .
	                     "Content-Type:text/html; charset=\"iso-8859-1\"\n" .
    	                "Content-Transfer-Encoding: 7bit\n\n" .
     nl2br($text) . "\n\n";
	 
	 if (is_array($datei)) {
	 	foreach($datei AS $key => $value) {
			 if (file_exists($value)) {
				 $fileatt = $value; // Path to the file
				 $fileatt_type = "application/octet-stream"; // File Type
				 if ($dateiname[$key]) {
					 $fileatt_name = $dateiname[$key];// Filename that will be used for the file as the attachment
				 }else{
				 	$fileatt_name = basename($value);
				 }
			 
				 $file = fopen($fileatt,'rb');
				 $data = fread($file,filesize($fileatt));
				 fclose($file);
			 
			 
				 $data = chunk_split(base64_encode($data));
			 
				 $email_message .= "--{$mime_boundary}\n" .
								   "Content-Type: {$fileatt_type};\n" .
								   " name=\"{$fileatt_name}\"\n" .
								   //"Content-Disposition: attachment;\n" .
								   //" filename=\"{$fileatt_name}\"\n" .
								   "Content-Transfer-Encoding: base64\n\n" .
								  $data . "\n\n" .
								 (*) "--{$mime_boundary}\n";

				 unset($data);
				 unset($file);
				 unset($fileatt);
				 unset($fileatt_type);
				 unset($fileatt_name);
			}
			(**)$email_message .= "{$mime_boundary}--\n\n";
		}
	 }elseif($datei) {
	 	if (file_exists($datei)) {
			 $fileatt = $datei; // Path to the file
			 $fileatt_type = "application/octet-stream"; // File Type
			 if ($dateiname) {
				$fileatt_name = $dateiname; // Filename that will be used for the file as the attachment
			 }else{
			 	$fileatt_name = basename($datei);
			 }
		 
			 $file = fopen($fileatt,'rb');
			 $data = fread($file,filesize($fileatt));
			 fclose($file);
		 
		 
			 $data = chunk_split(base64_encode($data));
		 
			 $email_message .= "--{$mime_boundary}\n" .
							   "Content-Type: {$fileatt_type};\n" .
							   " name=\"{$fileatt_name}\"\n" .
							   //"Content-Disposition: attachment;\n" .
							   //" filename=\"{$fileatt_name}\"\n" .
							   "Content-Transfer-Encoding: base64\n\n" .
							  $data . "\n\n" .
							   "--{$mime_boundary}--\n";
			 unset($data);
			 unset($file);
			 unset($fileatt);
			 unset($fileatt_type);
			 unset($fileatt_name);
		}
	}
	 
	 
	 $ok = @mail($an, $email_subject, $email_message, $headers); 
	 echo "OK: $ok";
}

Ersetze ich (*) durch (**) oder lasse (**) weg dann gibt er nur die PDF-Datei aus.
Bei nur einer Datei funktioniert es wunderbar!

Vielen Dank im Vorraus für eure Hilfe.
 
Zuletzt bearbeitet:
PHP Tags im BBCode. [PHP_] ..... Code .... [/PHP_]. Ohne den Unterstrich, den hab ich jetzt nur gemacht, weil er es sonst nicht anzeigt.
 
Ich weiss zwar nicht warum der Thread als erledigt markiert ist, zumindest kann ich aus den Posts nicht erkennen warum aber ist ja auch egal...
Falls das Thema als nicht erledigt ist dann nimm die Markierung bitte nochmal zurueck, falls das Thema erledigt ist dann poste doch bitte Deine Loesung; koennte ja schliesslich auch anderen zu Gute kommen.

Nun ja, nun mal zu meinem Vorschlag...
Ich haette da 2 kleine Klassen anzubieten, vielleicht kannst Du diese nutzen um Dir etwas Arbeit zu ersparen.
eMails mit PHP erstellen
eMails ueber einen beliebigen Server verschicken
Vielleicht funktionieren die ja bei PureTec. :)
 
Entschuldigt bitte, haber ich ganz vergessen

Die Lösung
PHP:
function MailVersenden($an, $cc, $bcc, $from, $betreff, $text, $datei, $dateiname) {

     $email_subject = $betreff; // The Subject of the email
 
 //        $email_to = ""; // Who the email is too
 
     $headers = "From: ".$from;
 
 
 
     $semi_rand = md5(time());
     $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
 
     $headers .= "\nMIME-Version: 1.0\n" .
                 "Content-Type: multipart/mixed;\n" .
                 " boundary=\"{$mime_boundary}\"";
 
     $email_message .=  "This is a multi-part message in MIME format.\n\n" . 
	 					"--{$mime_boundary}\n" .
	                     "Content-Type:text/plain; charset=\"iso-8859-1\"\n" .
    	                "Content-Transfer-Encoding: 7bit\n\n" .
     $text . "\n\n";
	 
	 if (is_array($datei)) {
	 	foreach($datei AS $key => $value) {
			 if (file_exists($value)) {
				 $fileatt = $value; // Path to the file
				 $fileatt_type = "application/octet-stream"; // File Type
				 if ($dateiname[$key]) {
					 $fileatt_name = $dateiname[$key];// Filename that will be used for the file as the attachment
				 }else{
				 	$fileatt_name = basename($value);
				 }
			 
				 $file = fopen($fileatt,'rb');
				 $data = fread($file,filesize($fileatt));
				 fclose($file);
			 
			 
				 $data = chunk_split(base64_encode($data));
			 
				 $email_message .= "--{$mime_boundary}\n" .
								   "Content-Type: {$fileatt_type};\n" .
								   " name=\"{$fileatt_name}\"\n" .
								   "Content-Disposition: attachment;\n" .
								   " filename=\"{$fileatt_name}\"\n" .
								   "Content-Transfer-Encoding: base64\n\n" .
								  $data . "\n\n";
				 $a++;
				 if ($a == count($datei)) {
					$email_message .= "--{$mime_boundary}--\n\n";
				 }else{
					$email_message .= "--{$mime_boundary}\n";
				 }
				 unset($data);
				 unset($file);
				 unset($fileatt);
				 unset($fileatt_type);
				 unset($fileatt_name);
			}
		}
	 }elseif($datei) {
	 	if (file_exists($datei)) {
			 $fileatt = $datei; // Path to the file
			 $fileatt_type = "application/octet-stream"; // File Type
			 if ($dateiname) {
				$fileatt_name = $dateiname; // Filename that will be used for the file as the attachment
			 }else{
			 	$fileatt_name = basename($datei);
			 }
		 
			 $file = fopen($fileatt,'rb');
			 $data = fread($file,filesize($fileatt));
			 fclose($file);
		 
		 
			 $data = chunk_split(base64_encode($data));
		 
			 $email_message .= "--{$mime_boundary}\n" .
							   "Content-Type: {$fileatt_type};\n" .
							   " name=\"{$fileatt_name}\"\n" .
							   //"Content-Disposition: attachment;\n" .
							   //" filename=\"{$fileatt_name}\"\n" .
							   "Content-Transfer-Encoding: base64\n\n" .
							  $data . "\n\n" .
							   "--{$mime_boundary}--\n";
			 unset($data);
			 unset($file);
			 unset($fileatt);
			 unset($fileatt_type);
			 unset($fileatt_name);
		}
	}
	 
	 
	 $ok = @mail($an, $email_subject, $email_message, $headers); 
	 echo "OK: $ok";
}

Nach jedem Anhang muss --{$mime_boundary}\n"; stehen, nur nach dem Letzten Anhang --{$mime_boundary}--\n";

Vielen Dank für Eure Bemühungen.
 
Zurück