Upload in sendmail.php?

Hallo Dave ich geb dir kurz die Prinzipien in der richtung mit:
$_FILES -> enthält Informationen zur hochgeladenen Datei.
Die Temp datei liest du dann mit file_get_contents() in einen String ein.
Den du dann an bestimmter stelle im Mail Header ausgeben musst. Das knifflige an der sache ist jetzt die mail zusammenzubauen.
Dazu wirst du nicht drumherum kommen den Beitrag durchzuarbeiten aber ich denke mit meiner starthilfe wird es etwas leichter gehen.
Aber das hier ist nunmal Tutorials elearning und wenn du hier postest dann musst du auch bereit sein es selbst zu erlernen.

EDIT: Du solltest übrigens die phpmailer klasse nutzen mit der standard mail funktion könnte es probleme geben. Den mailer findest du auf sourceforge bzw über google
 
Also Leute...
wenn ich alles richtig gelesen habe (verschiedene Vorschläge) dann werde ich es mit meiner sendmail.php nicht hinbringen?
Ich hoffe das ich da mal ausnahmsweise richtig Liege?
Nun habe ich folgendes gemacht in PHP und dies kommt direkt in der kontakt.php seite rein zuoberst im Quelltext-Code. (zeile 1)
Habe lange Gelesen und dies dann versucht, jedoch noch nicht getestet!
PHP:
<?php
if ($Senden=='Senden')
{
 if (isset($_FILES['Durchsuchen1']) and ! $_FILES['Durchsuchen1']['error'] and $_FILES['Durchsuchen1']['size']) 
 {
  $file1=$_FILES['Durchsuchen1']['tmp_name'];
  $name1=$_FILES['Durchsuchen1']['name'];
  $file_groesse1=$_FILES['Durchsuchen1']['size']/1024;
 }

$inhalt='<strong>Anrede:</strong>&nbsp;'.$anrede.'<br />
<strong>Nachname:</strong>&nbsp;'.$nachname.'<br />
<strong>Vorname:</strong>&nbsp;'.$vorname.'</font><br>
<strong>Strasse und Hausnummer:</strong>&nbsp;'.$strasse_nr.'</font><br>
<strong>PLZ und Ortschaft:</strong>&nbsp;'.$plz_ort.'</font><br>
<strong>Land:</strong>&nbsp;'.$land.'</font><br>
<strong>Telefonnummer:</strong>&nbsp;'.$tel.'</font><br>
<strong>Email Adresse:</strong>&nbsp;'.$email.'</font><br>
<strong>Betreff:</strong>&nbsp;'.$betreff.'</font><br>
<strong>Kommentar:</strong>&nbsp;'.$kommentar.'</font><br>
<strong>Anlage:</strong>&nbsp;'.$name1;

if (($file_groesse1<8200))
 {

  $mime_boundary = md5(uniqid(time()));

  $data1 = chunk_split(base64_encode(implode("", file($file1))));

  $content = "From: ".$email."\n";
  $content.= "Reply-To: " . $email . "\n";
  $content.= "Return-Path: " . $email . "\n";
  $content.= "MIME-Version: 1.0\n";
  $content.= "Content-Type: multipart/mixed; boundary=\"".$mime_boundary."\"\n";

  $content.= "--$mime_boundary\n";
  $content.= "Content-Type: text/html;\n";
  $content.= "Content-Transfer-Encoding: 7bit\n\n";
  $content.= $inhalt."\n\n";

  $content.= "--$mime_boundary\n";
  $content.= "Content-Type: application/Octet-Stream; name=\"".$name1."\"\n";
  $content.= "Content-Transfer-Encoding: base64\n";
  $content.= "Content-Disposition: attachment;\n\n";
  $content.= $data1."\n";

  $content.= "--$mime_boundary--\n";

  mail("XXX@XXX","Kontakt-Form aus Homepage","",$content);

  header("Location: kontakt-danke.php");
  exit;
 }
}
?>
Mein Email habe ich gewollt mit XXX verdeckt betreff Spam.
Was denkt Ihr? Ist dies der richtige Weg oder bin ich da nun wieder weiterweg von meinem Ziel. Das Durchsuchen-Feld sollte kein Pflichtfeld sein. Na ja...
 
Hi,

sieht doch schon ganz gut aus. Probier's einfach mal aus.
Dann brauchst Du nur noch einen else-Zweig, der eine simple Mail ohne Anhang verschickt, wenn nichts hochgeladen wurde.

LG

PS.: Du solltest register_globals abschalten und die Formulardaten aus dem $_POST-Array auslesen.
 
Zuletzt bearbeitet:
Das gestrige Formular funktioniert! :)
Allerdings wenn kein Anhang eingefügt wird, macht es irgendwie selber eines Namens "ATT00012.dat" à ca. 121 Bytes?

Nun zu den neuen Vorschläge...
PS.: Du solltest register_globals abschalten und die Formulardaten aus dem $_POST-Array auslesen.

Wäre dies so in etwa Richtig? Habe den $inhalt rausgenommen und nun wird aus der Form ausgelesen? Zusätzlich habe ich die Zeile $content.= $inhalt."\n\n"; gelöscht da nicht mehr notwendig und den Befehl $content in der Zeile mail mit $strMailtext ersetzt?

PHP:
<?php
if ($Senden=='Senden')
{
 if (isset($_FILES['anhang']) and ! $_FILES['anhang']['error'] and $_FILES['anhang']['size']) 
 {
  $file1=$_FILES['anhang']['tmp_name'];
  $name1=$_FILES['anhang']['name'];
  $file_groesse1=$_FILES['anhang']['size']/1024;
 }

if($_POST)
{
 $strMailtext = "";

 while(list($strName,$value) = each($_POST))
 {
  if(is_array($value))
  {
   foreach($value as $value_array)
   {
    $strMailtext .= $strName.$strDelimiter.$value_array."\n";
   }
  }
  else
  {
   $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

 if(get_magic_quotes_gpc())
 {
  $strMailtext = stripslashes($strMailtext);
 }

if (($file_groesse1<8200))
 {

  $mime_boundary = md5(uniqid(time()));

  $data1 = chunk_split(base64_encode(implode("", file($file1))));

  $content = "From: ".$email."\n";
  $content.= "Reply-To: " . $email . "\n";
  $content.= "Return-Path: " . $email . "\n";
  $content.= "MIME-Version: 1.0\n";
  $content.= "Content-Type: multipart/mixed; boundary=\"".$mime_boundary."\"\n";

  $content.= "--$mime_boundary\n";
  $content.= "Content-Type: text/html;\n";
  $content.= "Content-Transfer-Encoding: 7bit\n\n";

  $content.= "--$mime_boundary\n";
  $content.= "Content-Type: application/Octet-Stream; name=\"".$name1."\"\n";
  $content.= "Content-Transfer-Encoding: base64\n";
  $content.= "Content-Disposition: attachment;\n\n";
  $content.= $data1."\n";

  $content.= "--$mime_boundary--\n";

  mail("XXX@XXX","".$betreff."","",$strMailtext);

  header("Location: kontakt-danke.php");
  exit;
 }
}
?>

Habe es nun getestet, scheint nicht zu funktionieren, erhalte nur eine weisse Seite. :(
 
Zuletzt bearbeitet:
Hi,

na ja, jetzt übergibst Du mail() ja nur den reinen Text ($strMailtext). Du müsstest den aber an der richtigen Stelle in Deine $content-Variable einbinden und diese dann an mail() übergeben.

LG
 
Also, zurück, dies Funtkioniert ja sowiet mit und ohne Upload. Allerdings wird eine Datei angehängt wenn es kein Anhang gab mit dem Namen "ATT00012.dat" à ca. 121 Bytes.
Nun, verstehe ich nicht was du meinst
Dann brauchst Du nur noch einen else-Zweig, der eine simple Mail ohne Anhang verschickt, wenn nichts hochgeladen wurde.
PS.: Du solltest register_globals abschalten und die Formulardaten aus dem $_POST-Array auslesen.
Könntest du mir da Helfen. Ich sehe nur noch Sterne vor Augen. :(
PHP:
<?php
if ($Senden=='Senden')
{
 if (isset($_FILES['Durchsuchen1']) and ! $_FILES['Durchsuchen1']['error'] and $_FILES['Durchsuchen1']['size']) 
 {
  $file1=$_FILES['Durchsuchen1']['tmp_name'];
  $name1=$_FILES['Durchsuchen1']['name'];
  $file_groesse1=$_FILES['Durchsuchen1']['size']/1024;
 }

$inhalt='<strong>Anrede:</strong>&nbsp;'.$anrede.'<br />
<strong>Nachname:</strong>&nbsp;'.$nachname.'<br />
<strong>Vorname:</strong>&nbsp;'.$vorname.'</font><br>
<strong>Strasse und Hausnummer:</strong>&nbsp;'.$strasse_nr.'</font><br>
<strong>PLZ und Ortschaft:</strong>&nbsp;'.$plz_ort.'</font><br>
<strong>Land:</strong>&nbsp;'.$land.'</font><br>
<strong>Telefonnummer:</strong>&nbsp;'.$tel.'</font><br>
<strong>Email Adresse:</strong>&nbsp;'.$email.'</font><br>
<strong>Betreff:</strong>&nbsp;'.$betreff.'</font><br>
<strong>Kommentar:</strong>&nbsp;'.$kommentar.'</font><br>
<strong>Anlage:</strong>&nbsp;'.$name1;

if (($file_groesse1<8200))
 {

  $mime_boundary = md5(uniqid(time()));

  $data1 = chunk_split(base64_encode(implode("", file($file1))));

  $content = "From: ".$email."\n";
  $content.= "Reply-To: " . $email . "\n";
  $content.= "Return-Path: " . $email . "\n";
  $content.= "MIME-Version: 1.0\n";
  $content.= "Content-Type: multipart/mixed; boundary=\"".$mime_boundary."\"\n";

  $content.= "--$mime_boundary\n";
  $content.= "Content-Type: text/html;\n";
  $content.= "Content-Transfer-Encoding: 7bit\n\n";
  $content.= $inhalt."\n\n";

  $content.= "--$mime_boundary\n";
  $content.= "Content-Type: application/Octet-Stream; name=\"".$name1."\"\n";
  $content.= "Content-Transfer-Encoding: base64\n";
  $content.= "Content-Disposition: attachment;\n\n";
  $content.= $data1."\n";

  $content.= "--$mime_boundary--\n";

  mail("XXX@XXX","Kontakt-Form aus Homepage","",$content);

  header("Location: kontakt-danke.php");
  exit;
 }
}
?>
 
Hi,

Dann brauchst Du nur noch einen else-Zweig, der eine simple Mail ohne Anhang verschickt, wenn nichts hochgeladen wurde.

eine Mail mit Anhang ist anders aufgebaut, als eine Mail ohne. D.h. Dein Script muss ungefähr so aufgebaut sein:

PHP:
$mail_text = 'Anrede: '.$_POST['anrede']."\n";
$mail_text .= '...';
if(isset($_FILES['Durchsuchen1']) && ... ) {
   // multipart/mixed - Mail zusammenbauen
} else {
   // text/plain - Mail zusammenbauen
}

Wenn Du dann auch noch html im Textteil haben willst, wird's nochmal komplizierter. Dann muss der Textteil den Content-Type "multipart/alternative" haben und einen reinen Textteil und einen HTML-Teil enthalten (Achtung: eigene Boundary verwenden). Wenn man nur einen text/html-Part versendet, behandeln das einige Anbieter als Spam.

Außerdem musst Du die Benutzereingaben, die Du in den Mailheader steckst, vorher prüfen, sonst kann Dein Formular als Spamschleuder missbraucht werden => Email-Injection.

Vielleicht verstehst Du jetzt, warum Dir das nicht "mal eben" einer umschreibt, vor allem bei der Vorlage (wo hast Du das denn her?).
Warum benutzt Du nicht einfach eine Mail-Klasse, die HTML-Unterstützung bietet und Anhänge verarbeitet. Z.B. die aus Dennis' Class Collection

LG
 
Zurück