PHP Anhang per PHP senden, Fehler im Code?

Messa

Lt. Junior Grade
Registriert
Sep. 2009
Beiträge
398
Hi,
folgendes Problem: ich versuche per PHP eine Anhang mitzusenden, dieser kommt auch in der Mail an, aber bekomme immer die Fehlermeldung: Datei beschädigt. Jemand eine Idee? Danke.

PHP:
<?php

if (!empty($_POST)) {
	// get the posted data 
	$name = $_POST['name']; 
	$adress = $_POST['adress']; 
	$telefon = $_POST['telefon']; 
	$mobil = $_POST['mobil']; 
	$fax = $_POST['fax']; 
	$email_address = $_POST['email'];
	$stelle = $_POST['stelle'];
	$arbeit = $_POST['optionsRadios'];
	$email_subject = "XXX"; 
	$attachment = chunk_split(base64_encode(file_get_contents($_FILES['file']['tmp_name'])));
   	$filename = $_FILES['file']['name'];
   	$boundary =md5(date('r', time())); 
   	$message = strip_tags($_POST['message']);
	
   	$to = 'xxx@xxx.de';

	// write the email content 
    $headers = "From: xx@xxx.de\r\nReply-To: xx@xxx.de";
   	$headers .= "\r\nMIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"_1_$boundary\"";
	
	$message="This is a multi-part message in MIME format.

--_1_$boundary
Content-Type: multipart/alternative; boundary=\"_2_$boundary\"

--_2_$boundary
Content-Type: text/plain; charset=\"iso-8859-1\"
Content-Transfer-Encoding: 7bit

	--------------------------------
	--------------------------------
		
	Mitarbeit: 	$arbeit
	Stelle: 	$stelle
	
	Name: 	$name
	Adresse: 	$adress
	Telefon:	$telefon
	Mobil: 	$mobil
	Fax: 		$fax
	E-Mail: 	$email_address
	
	--------------------------------
	--------------------------------
	
--_2_$boundary--
--_1_$boundary
Content-Type: application/octet-stream; name=\"$filename\" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

$attachment
--_1_$boundary--";

}
?>
 
Mail-Versand schreibt man nicht selbst, man setzt auf fertige Bibliotheken, um genau solche Probleme elegant zu umgehen.
 
Kann es sein, dass einfach nur "filename" bei der Disposition fehlt?
 
Danke für die Antworten. @Krafty Der Dateiname wird übergeben, auch hat die Datei eine gewisse Größe, also ist nicht 0 KB groß. Ich stehe da auf dem Schlauch.
 
Tja. Du kannst jetzt gucken, wie du trotzdem was durch den Schlauch durch bekommst, obwohl du drauf stehst... oder du kannst einfach einen SChritt zu Seite machen und auf Bibliotheken wie PHPMailer oder SwiftMailer setzen. Problem in 5 Minuten gelöst.
 
@Messa: Du übergibst bisher "name" beim Content-Type, aber nicht "filename" bei der Disposition.
Außerdem muss man leider sklavisch auf Kleinigkeiten achten, auch Anzahl der Zeilenumbrüche, hatte das auch mal in .NET nachgebaut und ne Weile gesessen.

Code:
Content-Disposition: attachment; filename=\"$filename\"

Kannst du evtl den Code der erzeugten Mail, wie er auf der anderen Seite ankommt, pasten, natürlich mit einem sehr kleinen Anhang.

@Daaron: Wie kommst du darauf, dass einfach nur Mail versenden Sinn der Übung sein soll?
Es ist schon wichtig zu wissen, was eigentlich passieren muss.

Edit: Ja, wir haben schon verstanden, dass es mit der Klasse wesentlich komfortabler ist, aber darum geht es nicht.
Wenn dich jemand fragt, wie MIME Code auszusehen hat, dann kannst du nicht einfach sagen "nimm doch ne fertige Klasse".
 
Zuletzt bearbeitet:
Es spielt doch keine Rolle, ob der Code noch mehr tun soll, z.B. erfolgreichen Mailversand loggen oder andere DB-Aktionen ausführen. Im obigen Snippet geht es ausschließlich um Versand, und den lösen Mailer-Bibliotheken eben als No-Brainer.

Mit guter Abstraktion hast du am Ende in etwa sowas:
PHP:
$mail = new \Email();
$mail->attachFile($filename, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
$mail->subject = $subject;
$mail->html = $htmlText;
$mail->text = $pureText;
$mail->sendTo($strSendTo);
 
Zurück
Oben