rezix: PHP: Mailversand mit Attachment

Hallo habe mir da ein wunderbares Skript im Internet geholt.. den Text nimmt er schön mit.. im Formular kann er ein Bild "uploaden" und mit senden... jedoch erhalte ich im Attachment, zwar den richtigi bild namen aber irgendwie: 265BYTE!!!

Und kann das bild dann nicht öffnen..???

$vorname  = $_POST[vorname];
$telefon  = $_POST[telefon];
$kanton   = $_POST[kanton];
$alter   = $_POST[alter];
$mailadresse = $_POST[mailadresse];
$kommentar  = $_POST[beitrag];
$bild    = $_POST['bild_anhang'];
$mail_from  = "Text test@test.ch";

$grenze = "grenzlinie";
$bildname=$HTTP_POST_FILES['bild_anhang']['name'];

$headers="MIME-Version: 1.0\r\n";
$headers.="From: $mail_from\n";
$headers.="Content-Type: multipart/mixed;\n\tboundary=$grenze\n";
$message="\n--$grenze\n";
$message.="Content-transfer-encoding: 7BIT\r\n";
$message.="Content-type: text/plain\n\n";
$message.="Guten Tag.\n$vorname hat ein neues Inserat aufgegeben.\n\n";
$message.="Telefon:  $telefon\n";
$message.="Alter: $alter\n";
$message.="Kommentar: $beitrag\n";
$message.="\n\n";

$message.="\n--$grenze\n";
$message.="Content-Type: application/octetstream;\n\tname=$bildname\n";
$message.="Content-Transfer-Encoding: base64\n";
$message.="Content-Disposition: attachment;\n\tfilename=$bildname\n\n";

if($bild != '')
{
 $dateizeiger = fopen("$bild", "rb");
 $dateiinhalt = fread($dateizeiger,filesize("$bild"));
 fclose($dateizeiger);
}

$dateiinhalt = chunk_split(base64_encode($dateiinhalt));

$message.= $dateiinhalt;
$message.= "\n\n";
$message.="--$grenze";

mail("xyz@xyz.ch","Anmeldung",$message,$headers);
echo "Die Email wurde erfolgreich versendet";

was läuft hier schief??

  1. Hallo,

    habe mir da ein wunderbares Skript im Internet geholt..

    naja, wunderbar dahingeschlampt, mal gar keine Anführungszeichen, mal zu viele Anführungszeichen, keine Fehlerprüfung, ungesicherte Übernahme von externen Daten (da freuen sich die Spammer) …

    im Formular kann er ein Bild "uploaden" und mitsenden... jedoch erhalte ich im Attachment, zwar den richtigen bildnamen, aber irgendwie: 265BYTE!!!

    Ohne jetzt in die PHP-Anleitung geschaut zu haben, dünket mich:

    $bild    = $_POST['bild_anhang'];

    $bildname=$HTTP_POST_FILES['bild_anhang']['name'];

    if($bild != '')
    {
    $dateizeiger = fopen("$bild", "rb");

    1. Dateien werden von PHP in $_FILES übermittelt, nicht (mehr) in $HTTP_POST_FILES.

    2. Hochgeladene Dateien werden von PHP unter einem zufällig erzeugten Namen auf dem Server gespeichert. Du benutzt stattdessen für den Zugriff auf diese temporäre Datei ein Datum aus dem Formular als Dateiname, vermutlich jenes aus <input type="file" name="bildanhang">.
    Ich weiß nicht, wie bzw. ob PHP solche <input>-Felder auch in $_POST ablegt, normalerweise landen sie wie schon unter 1. geschrieben in $_FILES, aber die Methode ist zumindest überaus unorthodox und als solche verdächtig.

    Informiere dich in der PHP-Anleitung, wie man über ein Formular hochgeladene Dateien im Skript weiterverarbeitet, es gibt extra eine Seite dafür.

  2. Hallo rezix,

    [...] den Text nimmt er schön mit.. im Formular kann er ein Bild "uploaden" und mit senden... jedoch erhalte ich im Attachment, zwar den richtigi bild namen aber irgendwie: 265BYTE!!!

    Und kann das bild dann nicht öffnen..???

    ich hab auf die Schnelle nicht gesehen, woran es liegt, aber es könnte durchaus hilfreich sein, wenn Du Dir mal eventuelle Warnungen usw. von PHP ausgeben läßt. Dazu am einfachsten am Anfang des Skriptes [link:http://se.php.net/error_reporting@title=error_reporting()] auf E_ALL oder E_STRICT setzen.

    $vorname  = $_POST[vorname];
    [...]

    Das funktioniert zwar, ist aber an sich nicht ganz richtig, $_POST['vorname'] wäre richtig.

    $bildname=$HTTP_POST_FILES['bild_anhang']['name'];

    Nun, wenn man oben schon korrekterweise $_POST nimmt, warum nimmt man hier dann nicht [link:http://se.php.net/manual/en/reserved.variables.php#reserved.variables.files@title=$_FILES], sondern eine "veraltete Variable"?

    [...]

    Insgesamt frage ich mich, ob es, wenn man schon irgendein Skript nimmt, das man im Netz findet, nicht sinnvoll wäre gleich etwas bekannteres und wohl auch besser getestetes und dokumentiertes wie z.B. PEAR Package Mail_Mime zu nehmen. Dort gibt es auch ein Beispiel, wie man dieses Package benutzt: PEAR Manual: Mail_Mime - Example.

    Grüße aus Stockholm,
    Götz

    --
    Losung für Freitag, 8. Februar 2008
    Bekehre du mich, so will ich mich bekehren; denn du, HERR, bist mein Gott! (Jeremia 31,18)
    Gott spricht: Siehe, ich stehe vor der Tür und klopfe an. Wenn jemand meine Stimme hören wird und die Tür auftun, zu dem werde ich hineingehen und das Abendmahl mit ihm halten und er mit mir. (Offenbarung 3,20)
    (aktuelle Losung)
    1. echo $begrüßung;

      [...] es könnte durchaus hilfreich sein, wenn Du Dir mal eventuelle Warnungen usw. von PHP ausgeben läßt.

      Das ist unstreitig beim Entwickeln und Fehlersuchen immer [r|w]ichtig, aber ...

      Dazu am einfachsten am Anfang des Skriptes error_reporting() auf E_ALL oder E_STRICT setzen.

      ... E_STRICT ist keine Alternative zu E_ALL. Denn E_STRICT ist ein einzelnes Flag, das weder die anderen aus E_ALL enthält noch in E_ALL enthalten ist (Stand PHP 5). Zudem wird E_STRICT in den meisten Anfängerfällen nicht benötigt. Damit wird man eher auf Stil-Fragen hingewiesen, die beim Umstieg von objektorientierten Scripten von PHP4 auf 5 anfallen.

      Wenn man dann noch das error_reporting nicht als Funktion im Script aufruft, sondern in der Konfiguration seiner Entwicklungsumgebung fest einstellt, dann kommt man schon nahe an das Hohe C der PHP-Entwicklung. Nicht vergessen sollte man, das display_errors einzuschalten, und sich Gedanken zu machen, wie man in seiner Produktivumgebung einerseits den Anwender nicht mit Fehlermeldungen behelligt, für die er nichts kann, und andererseits selbst informiert wird, wenn eine solche auftritt.

      echo "$verabschiedung $name";