$filespecs) ## $filespecs muss nicht benutzt werden { if ($_files[$feldname]['error']===0) { # es wurde EINE Datei unter dem Feldnamen hochgeladen, es trat kein Fehler auf $_file = array(); $_file['feldname'] = $feldname; # Feldname des Upload-Feldes $_file['client_type'] = $_files[$feldname]['type']; # gemeldeter Type des uploaded Files (Client) $_file['type'] = mime_content_type($_files[$feldname]['tmp_name']); # Type des uploaded Files (Server) $_file['name'] = basename($_files[$feldname]['name']); # Name des uploaded Files $_file['tmp_name'] = $_files[$feldname]['tmp_name']; # Temp-Name des uploaded Files $_file['size'] = $_files[$feldname]['size']; # Größe des uploaded Files $_attach[] = $_file; # Filemetadaten ins array eintragen } elseif (is_array($_files[$feldname]['error'])) { # es wurden mehrere Dateien unter dem Feldnamen hochgeladen foreach ($_files[$feldname]['error'] as $key => $error) { if ($error === 0) { ## unter dem Tempörärnamen $_FILES[$feldname]['tmp_name'][$key] liegt nun ## eine Datei vor, deren Mime-Type an mit $_file = array(); $_file['feldname'] = $feldname; # Feldname des Upload-Feldes $_file['client_type'] = $_files[$feldname]['type'][$key]; # vom Client gemeldeter Typ $_file['type'] = mime_content_type($_files[$feldname]['tmp_name'][$key]); # wirklicher Typ des uploaded Files $_file['name'] = basename($_files[$feldname]['name'][$key]); # Name des uploaded Files $_file['tmp_name'] = $_files[$feldname]['tmp_name'][$key]; # Temp-Name des uploaded Files $_file['size'] = $_files[$feldname]['size'][$key]; # Größe des uploaded Files $_attach[] = $_file; # Filemetadaten ins array eintragen } elseif ($_files[$feldname]['error'][$key] === 4) { # Upload enthioelt keine Filedaten } else { ## Fehlermeldung entsprechend Muster im IF-Zweig $_error[] = "Mit Datei '".$_FILES[$feldname]['name'][$key]. "' trat der Fehler ".$_FILES[$feldname]['error'][$key]." auf"; } } } else { $_error[] = "unerlaubte Operation beim Fileupload"; } } return $_attach; } #-------------------------------------------------------------------- # Bestimmung des Mime-Content-Types if(!function_exists('mime_content_type')) { function mime_content_type($filename) { $filepath = realpath($filename); $_mime = array(); // Spaces werden maskiert, weil sie sonst trennen $filepath = str_replace(" ","\\ ",$filepath); exec ("file -bi $filepath", $_mime, $error); if (($error) or (count($_mime) != 1)) return false; if (strpos($_mime[0], "can't stat") !== false) { $mime = "Typ unbekannt"; } elseif (strpos($_mime[0], "can't read") !== false) { $mime = "Datei nicht lesbar"; } elseif (strpos($_mime[0], "can't ") !== false) { $mime = "unbekannter Fehler"; } else { $mime = trim($_mime[0]); } return $mime; } } #-------------------------------------------------------------------- function mime_mail($from,$recipient,$subject,$text,$_files=array()) { $_err = array(); if (strlen($recipient)<4) ## schöner Mail@check wäre besser { $_err[] = "Empfängerangabe fehlt"; return $_err; } ## Empfänger-Zeilen umbrechen, damit sie nicth 76 Zeichen überschreiten ## Es könnten jetzt noch Semikolon oder Doppelkomma drinstehen... ## Sollte man noch korrigieren $recipient = str_replace(",", ",".CRLF, $recipient); ## Filearray umsortieren $_attach = convert_filearray($_files,$_err); if(count($_err) > 0) return $_err; $text = wordwrap($text,76,CRLF,1); ## Textumbruch nach maximal 76 Zeichen ## einen Boundary-Kern berechnen $boundary = strtoupper(md5(uniqid(time()))); $header=""; if (strlen($from)>0) ## keine leeren Header setzen, Mailclient stirbt! { $header .= "From: <$from>".CRLF; //kommt von Formular } $header .= "MIME-Version: 1.0".CRLF; $header .= "Content-Type: multipart/mixed;".CRLF." boundary=\"$boundary\"".CRLF; ## nach den zwei Zeilenschaltungen beginnt der Mailbody $header .= "This is a multi-part message in MIME format".CRLF. "Dies ist eine mehrteilige Nachricht im MIME-Format".CRLF.CRLF; ### nach dieser Boundary beginnt der erste Mime-Teil $header .= "--$boundary".CRLF; $header .= "Content-Type: text/plain".CRLF; $header .= "Content-Transfer-Encoding: 8bit".CRLF.CRLF; # 20 nach wieder zwei Zeilenschaltungen beginnt der Body dieses # Abschnitts. Und das ist der Plain-Text. $header .= "$text".CRLF.CRLF; # Attachments anfügen if(is_array($_attach)) { foreach($_attach as $_filedata) { if ($_filedata["size"] > 0) ## wurde das File-Feld benutzt? { ## An dieser Stelle könnte auch $_filedata['feldname'] geprüft ## werden, ob das Feld überhaupt genehmigtes Fileupload-Feld ist ## und $_filedata['type'], ob der MIME-Type der Datei angenehm ist. $fh = @fopen($_filedata["tmp_name"],"rb"); ## Temporärdatei öffnen if ($fh) ## hats geklappt? { $file_content = @fread($fh,$_filedata["size"]); @fclose($fh); ## Codiertes Attachment aller 76 Zeichen umbrechen $file_content = chunk_split(base64_encode($file_content),76,chr(10)); ## hier nur "\n" benutzen! $header .= "--$boundary".CRLF; $header .= "Content-Type: ".$_filedata['type'].";".CRLF. " name=\"".basename($_filedata["name"])."\"".CRLF; $header .= "Content-Transfer-Encoding: base64".CRLF; $header .= "Content-Disposition: attachment;".CRLF. " filename=\"".basename($_filedata["name"])."\"".CRLF.CRLF; $header .= "$file_content".CRLF.CRLF; } else ## wenn nicht, Fehlermeldung für das eine Attachment erzeugen { $_err[] = "Attachment File ".$_filedata["name"]." kann nicht übertragen werden"; } } } ## end foreach() } ## end if isarray() ###Ende Vorbereitung $header .= "--$boundary--".CRLF; $ok = mail($recipient,$subject,"",$header); if ($ok) { $_err[] = "Ok"; $_err[] = "Nachricht wurde versandt..."; } else { $_err[] = "Fehler"; $_err[] = "Nachricht konnte nicht gesendet werden..."; } ## nur zum Debug # echo "
";
  # echo htmlentities($header);
  # print_r($_FILES);
  # print_r($_attach);
  # echo "
"; return $_err; } // end of mime_mail() #-------------------------------------------------------------------- function strip($data) { if (!get_magic_quotes_gpc()) { return $data; } if (is_array($data)) { foreach($data as $key => $val) { $data[$key] = strip($val); } } else { $data = stripslashes($data); } return $data; } ############################################################################### # Hauptprogramm ############################################################################### $_err = array(); $_POST = strip($_POST); ## rekursiv alle Magic Quotes entfernen $from = ''; $subject = ''; $to = ''; $text = ''; if (isset($_POST['absender'])) { $from = trim($_POST['absender']); } if (isset($_POST['subject'])) { $subject = trim($_POST['subject']); } if (isset($_POST['text'])) { $text = $_POST['text']; } if (isset($_POST['empfaenger'])) { $to = trim($_POST['empfaenger']); } if (isset($_POST['btn']['send'])) { if (isset($_POST['password']) and ($password == $_POST["password"])) { $_err = mime_mail($from,$to,$subject,$text,$_FILES); if ($_err[0]=="Ok") { ## Rücksetzen der Postvars $from = ""; $subject = ""; $to = ""; $text = ""; } } else { $_err[] = "Passwort ist falsch"; $_err[] = "eMail wurde nicht versandt"; } } $errstr = ''; foreach ($_err as $meldung) { $errstr .= "
".htmlentities($meldung); } ############################################################################### # HTML-Ausgabe ############################################################################### ?> Mime Mail Formmailer
Empfänger:
Absender:
Betreff:
Text:
Attachment:
Attachment:
Attachment:
Passwort: