Sven Rautenberg: E-Mail: Muss sich der PDF-Anhang im Header befinden?

Beitrag lesen

Moin!

Da ich mich damit nicht wirklich auskenne, habe ich mir ein paar Beispielscripte zusammengesucht. Alle gefundenen Scripte schreiben die PDF in den Kopfbereich (4. Parameter von mail()). Allerdings haben diese immer dafür gesorgt, dass sich PHP bei mail() aufhängt (60 Sekunden werden überschritten), die PDF wird aber seltsamer Weise trotzdem versendet. Nun habe ich einfach mal probiert, was passiert, wenn ich die PDF in den Nachrichtenteil (Parameter 3 bei mail()) packe. Tatsächlich funktioniert es so ohne Probleme.

Ich kann nicht ganz nachvollziehen, warum es in deinem ersten Beispiel nicht funktioniert, aber ich kann erklären, warum es überhaupt funktioniert - aber schlecht ist. :)

Mails sind nichts anderes als fortlaufender Text - ein Zeichen nach dem anderen. Damit man in solch einen Datenstrom etwas Struktur für wichtige Informationen hineinbringen kann, gibt es sozusagen "Formatierungskonventionen". Die oberste und wichtigste ist: Eine Mail beginnt erstmal mit dem Header, und sobald eine komplette Leerzeile kommt, endet der Header, und es beginnt der Body.

Daraus ergeben sich zwei wichtige Konsequenzen:
1. Innerhalb des Headers darf es keinerlei formatierende Leerzeilen geben, denn die würden den Body starten.
2. Wenn man sich aber der Konsequenzen bewußt ist, kann man eine Leerzeile auch absichtlich ausnutzen, um im "Header" den Body zu starten.

Der Befehl mail() hängt einfach nur Header-Parameter und Body-Parameter, getrennt durch eine Leerzeile, hintereinander und schickt das Ergebnis zum Mailserver.

Es ist allerdings keine gute Idee, aufgrund dieser Logik den Body-Parameter einfach zu ignorieren und sämtlichen Mailinhalt künstlich über den Header-Parameter zu versenden. Beispielsweise verhindert die PHP-Sicherheitsextension Suhosin diese Vorgehensweise, denn genauso, wie man absichtlich Body-Text in den Header-Parameter geben kann, so kann es einem auch unabsichtlich bzw. durch Spammer passieren, wenn man die Headerzeilen nicht komplett statisch im Skript ablegt, sondern sie mit Variablen anreichert. Die Variablen könnten ebenfalls eine Leerzeile (und nachfolgend Spam-Werbebotschaften) enthalten und so das Skript mißbrauchen, ohne dass es gewollt ist.

Dein Reparaturversuch ist allerdings nicht korrekt:

Hier der Code meiner Funktion:

function verschickePdfMail($empfaenger, $betreff, $text, $pdfPfad, $pdf_dateinameMail){
$id = md5(uniqid(time()));
$dateiinhalt = file_get_contents($pdfPfad);

// Absender Name und E-Mail Adresse
//$kopf = "From: Manfred Mustermann meine@mailadresse.xy\n";
$kopf = "";
$body = "";
$kopf .= "MIME-Version: 1.0\n";
$kopf .= "Content-Type: multipart/mixed; boundary=$id\n\n";

// Am Ende dieser Zeile kommt die Leerzeile, die den Header beendet. Alles nachfolgende ist schon Body!

$kopf .= "This is a multi-part message in MIME format\n";
$body .= "--$id\n";
$body .= "Content-Type: text/plain; charset=ISO-8859-15\n";
$body .= "Content-Transfer-Encoding: 8bit\n\n";
$body .= $text; // Inhalt der E-Mail (Body)
// Content-Type: image/gif, image/jpeg, image/png » MIME-Typen - selfHtml.org
$body .= "\n--$id";
$body .= "\nContent-Type: application/pdf; name=$pdf_dateinameMail\n";
$body .= "Content-Transfer-Encoding: base64\n";
$body .= "Content-Disposition: attachment; filename=$pdf_dateinameMail\n\n";
$body .= chunk_split(base64_encode($dateiinhalt));
$body .= "\n--$id--";
return mail($empfaenger, $betreff, $body, $kopf); // E-Mail versenden
}

  
 - Sven Rautenberg

-- 
"Love your nation - respect the others."