Email mit Anhang
Albert
- php
1 Tom
Hallo,
ich habe hier folgenden Quelltext für ein E-Mail-formular mit Anhang. Alles fuktioniert auch wunderbar. Wählt man jedoch keinen Anhang aus, so erscheint nach dem Klicken auf "abschicken" diese Fehlermeldung: "Warning: fread(): supplied argument is not a valid stream resource in /vrmd/homepages/u38769/htm/anbieten.htm on line 64". Die Mail kommt aber trotzdem an. Ist ein Anhang ausgewählt so kommt keine Fehlermeldung.
Nun die Frage an euch: Was muss geändert werden damit die Fehlermeldung nicht mehr erscheint? Hier der Testlink!
Quelltext:
<div id="inhalt">
<p>
<h2>Gebrauchtwagen Formular</h2>
</p>
<p style="font-style: italic; font-size: 80%">Die mit einem * gekennzeichneten Felder sind Pflichtangaben.</p>
<?php
$Empfaenger = "alexanderdamm@web.de";
if($_REQUEST['Send'])
{
if(empty($_REQUEST['Name']) || empty($_REQUEST['Email']) || empty($_REQUEST['Phone']) || empty($_REQUEST['Anschrift']))
{
echo"Bitte gehen Sie <a href=\"javascript:history.back();\">zurück</a> und füllen Sie alle Felder aus, die mit einem * gekennzeichnet sind!";
}
else
{
$Mailbetreff = "Angebot: ";
$Mailbetreff .= $_REQUEST['Name'];
$Trenner = md5(uniqid(time()));
$Header = "From: ".$_REQUEST['Email'];
$Header .= "\n";
$Header .= "MIME-Version: 1.0";
$Header .= "\n";
$Header .= "Content-Type: multipart/mixed; boundary=$Trenner";
$Header .= "\n\n";
$Header .= "This is a multi-part message in MIME format";
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: text/plain";
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: 8bit";
$Header .= "\n\n";
$Header .= "Sie haben folgendes Angebot erhalten: \n\n";
while(list($Formularfeld, $Wert) = each($_REQUEST))
{
if($Formularfeld != "Send" && $Formularfeld != "Anhang")
{
$Header .= $Formularfeld.": ".$Wert."\n";
}
}
$Header .= "\nDatum/Zeit: ";
$Header .= date("d.m.Y H:i:s");
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: ";
$Header .= $_FILES['Anhang']['type'];
$Header .= "; name=";
$Header .= $_FILES['Anhang']['name'];
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: base64";
$Header .= "\n";
$Header .= "Content-Disposition: attachment; filename=";
$Header .= $_FILES['Anhang']['name'];
$Header .= "\n\n";
$Dateiinhalt = fread(fopen($_FILES['Anhang']['tmp_name'], "r"), $_FILES['Anhang']['size']);
$Header .= chunk_split(base64_encode($Dateiinhalt));
$Header .= "\n";
$Header .= "--$Trenner--";
mail($Empfaenger, $Mailbetreff, "", $Header);
echo "<p>Vielen Dank für Ihr Angebot!<br>Wir werden uns schnellstmöglich mit Ihnen in Verbindung setzen.</p>";
echo "<p><a href=\"".$_SERVER['PHP_SELF']."?from_name=$from_name&from_mail=$from_mail\">Zurück zum Formular</a></p>";
}
}
else
{
?>
<table border="0" cellpadding="1" cellspacing="2">
<form action="<?php echo$_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post">
<tr>
<td valign=top>Firmen Anschrift: *</td>
<td><textarea cols="40" name="Anschrift" rows="5"></textarea></td>
</tr>
<tr>
<td>Ansprechpartner: *</td>
<td><input name="Name" size="50" type="text"></td>
</tr>
<tr>
<td>Telefon: *</td>
<td><input name="Phone" size="25" type="text"></td>
</tr>
<tr>
<td>Fax: </td>
<td><input name="Fax" size="25" type="text"></td>
</tr>
<tr>
<td>E-Mail: *</td>
<td><input name="Email" size="50" type="text"></td>
</tr>
<tr>
<td>Fahrzeughersteller: </td>
<td><input name="Hersteller" size="50" type="text"></td>
</tr>
<tr>
<td>Fahrzeug Typ: </td>
<td><input name="Typ" size="25" type="text"></td>
</tr>
<tr>
<td>Motorvariante: </td>
<td><input name="Motor" size="25" type="text"></td>
</tr>
<tr>
<td>Radstand:</td>
<td><input name="Radstand" size="25" type="text"></td>
</tr>
<tr>
<td>Federung VA:</td>
<td><input name="FederungVA" size="25" type="text"></td>
</tr>
<tr>
<td>Federung HA:</td>
<td><input name="FederungHA" size="25" type="text"></td>
</tr>
<tr>
<td>Fahrerhaus:</td>
<td><input name="Fahrerhaus" size="50" type="text"></td>
</tr>
<tr>
<td>Erstzulassung KFZ-Brief: </td>
<td><input name="Erstzulassung" size="25" type="text"></td>
</tr>
<tr>
<td>Kilometerstand laut Tacho: </td>
<td><input name="Kilometerstand" size="10" type="text"></td>
</tr>
<tr>
<td>Sonstige Ausstattung:</td>
<td><textarea cols="60" name="SonstAusstattung" rows="5"></textarea></td>
</tr>
<tr>
<td>Aufbauhersteller:</td>
<td><input name="AufbHersteller" size="50" type="text"></td>
</tr>
<tr>
<td>Aufbau Typ:</td>
<td><input name="Aufbautyp" size="25" type="text"></td>
</tr>
<tr>
<td>Herstellerbaujahr:</td>
<td><input name="Baujahr" size="10" type="text"></td>
</tr>
<tr>
<td>Aufbaumaße L/B:</td>
<td><input name="AufbMasse" size="25" type="text"></td>
</tr>
<tr>
<td>Aufbauausstattung:</td>
<td><textarea cols="60" name="Aufbauausstattung" rows="5"></textarea></td>
</tr>
<tr>
<td>Kran Hersteller:</td>
<td><input name="Kranhersteller" size="50" type="text"></td>
</tr>
<tr>
<td>Typ Hersteller:</td>
<td><input name="Typhersteller" size="25" type="text"></td>
</tr>
<tr>
<td>Herstellerbaufahr:</td>
<td><input name="Herstbaufahr" size="50" type="text"></td>
</tr>
<tr>
<td>Produktionsnummer:</td>
<td><input name="Prodnummer" size="25" type="text"></td>
</tr>
<tr>
<td>Kranausstattung:</td>
<td><textarea cols="60" name="Kranausstattung" rows="5"></textarea></td>
</tr>
<tr>
<td>Verkaufspreis zzügl. MwSt. (Endkunde/ Internet) in Euro:</td>
<td><input name="PreisEndkunde" size="10" type="text"></td>
</tr>
<tr>
<td>Verkaufspreis zzügl. MwSt. (An Fahrzeugbesitzer) in Euro:</td>
<td><input name="PreisFahrzeugbesitzer" size="10" type="text"></td>
</tr>
<tr>
<td>Sonstiges:</td>
<td><textarea cols="60" name="Sonstiges" rows="5"></textarea></td>
</tr>
<tr>
<td>Anhang/Foto:</td>
<td><input name="Anhang" size="50" type="file"></td>
</tr>
<tr>
<td colspan="2" style="font-style: italic; font-size: 80%">Wenn Sie Ihrem Angebot mehr als eine Datei hinzufügen möchten, so packen Sie bitte alle gewünschten Dateien in eine rar- oder zip-Datei.</td>
</tr>
<tr>
<td height="40"></td>
</tr>
<tr>
<td align="center" colspan="2"><input name="Send" type="submit" value="Abschicken"> <input name="Reset" type="reset" value="Löschen"></td>
</tr>
</form>
</table>
<?php
}
?>
</div>
Vielen Dank schonmal vorab für eure Hilfe!
Hello,
oh jeh!
Das ist eine wunderbare Spamschleuder und sogar ganz bequem per Get-Request zu bedienen!
Du solltest Dur als erstes ma alle Artikel hier im Forums-Archiv ziehen, die sich mit den Themen "MIME Mail" und "Mail Server Injection" oder so ähnlich formuliert beschäftigen.
Und warum lässt Du eine Multipart-MIME-Meil erzeugen, auch wenn gar kein Anlass dazu besteht?
Hier wäre ein IF() mehr doch wirklich nicht zuviel verlangt.
Außerdem sollte der Upload einer Datei im Formular abgekoppelt werden von der Überprüfung der übrigen Daten. Dazu wirst Du dann aber eine Session oder zumindest eine Formular-ID benötigen. Warum soll das File jedes Mal neu übertragen werden müssen, nur weil ein gefordertes Datenfeld nicht ausgefüllt wurde?
Der unbedingte Zugriff
$Dateiinhalt = fread(fopen($_FILES['Anhang']['tmp_name'], "r"), $_FILES['Anhang']['size']);
unter Benutztung der Daten vom Client (['size']) ist auch nicht ok. Das ist vermutlich Deine gesuchte Fehlerquelle. Ich mag das aber gar nicht genauer erklären, bevor Du das Scriot nicht besser strukturiert hast und die Möglichkeit zur Mail-Server-Injection beseitigt hast.
Diese ist immer dann vorhanden, wenn man gestattet, dass aus dem Request ungefiltert Daten in die Header der Mail gelangen können. Dis geht auch über die Funktionsargumente $to und $subject der mail()-Funktion.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg