Hi,
<?php
$file = "pdfdatei.pdf";
$file_name = "wie_soll_anhang_heissen.pdf";
$from = "test@example.org";
$to = "meine@example.de";
$message = "Hier steht dann die Nachricht der Mail";
$boundary = strtoupper(md5(uniqid(time())));
$mail_header = "From:Test <$from>";
$mail_header .= "\nMIME-Version: 1.0";
$mail_header .= "\nContent-Type: multipart/mixed; boundary=$boundary";
$mail_header .= "\n--$boundary";
$mail_header .= "\nContent-Type: text/plain";
$mail_header .= "\nContent-Transfer-Encoding: 8bit";
$mail_header .= "\n$message";
hier schon ein guter Rat und zwei Rügen:
a) Schreibe die \n ans Zeilenende, das ist intuitiver: Zeilen werden mit einem \n *beendet*.
b) Entscheide dich für *einen* Content-Type-Header. Zwei sind Unsinn.
c) Warum packst du die eigentliche Message in den Header? Das würde zwar funktionieren, wenn du einen doppelten Zeilenumbruch davor setzen würdest; PHP fügt beim Absenden auch nur Header und Body mit zwei Zeilenumbrüchen zusammen. Aber "sauber" ist es nicht.
Egal: So wie du es jetzt hast, wird dein Message-Text als Headerzeile interpretiert, weil die Leerzeile fehlt.
$file_content = fread(fopen($file,"r"),filesize($file));
$file_content = chunk_split(base64_encode($file_content));
Ziehe diese Anweisungen zum Debugging mal auseinander: Liefert fopen() ein gültiges File-Handle? Liefert fread() einen String, der mit der Dateigröße übereinstimmt?
$mail_header .= "\n--$boundary";
Immer noch keine Leerzeile. Wir sind also immer noch im globalen Mail-Header.
$mail_header .= "\nContent-Type: application/octetstream; name="$file_name"";
Beachte den Bindestrich beim MIME-Typ application/octet-stream.
$mail_header .= "\nContent-Transfer-Encoding: base64";
$mail_header .= "\nContent-Disposition: attachment; filename="$file_name"\n";$mail_header .= "$file_content\n";
$mail_header .= "--$boundary--\n";
mail("$to","Betreff","$message","$mail_header");
Jetzt wird's wüst: Mal abgesehen davon, dass es einfach Unsinn ist, Stringvariablen nochmal in einen String einzubetten - du willst hier eine Mail verschicken, die die ursprünglich übergebene Message als Text enthält und den ganzen Block, den du eben aufbereitet hast (in dem $message ja auch schon drinsteckt) als Header?
$to ist selbstverständlich im Test eine korrekte Mailadresse von mir.
Die Email kommt an. Der Anhang ist 0kb groß. Warum? Die Datei ist auch i.O.
Theoretisch dürfte dein Mailclient gar keinen Anhang erkennen. Auch nicht in einer Länge von 0 Bytes.
Ich finde einfach den Fehler nicht.
Kaum zu glauben. Dabei hast du so viele eingebaut ...
So long,
Martin
Ist die Katze gesund,
freut sich der Hund.