php mail-Formular: Attachment??
Tom
- php
Hallo zusammen,
entschuldigt bitte, dass ich schon wieder diese Frage stelle. (Die anderen Threads habe ich schon gesichtet und nichts pssendes gefunden)...
Ich habe ein Mailformular, mit dem ich auch ein Attachment versenden will, das die Kunden via Formular an mich schicken können.
Ich habe folgendes Script gefunden und angepasst. Funzt trotzdem nicht. Was mach ich falsch??
$file = "$anhang";//Wird vom Forumlar als String E://bla/bla.jpg übergeben
$file_name = $anhang;//dto
$boundary = strtoupper(md5(uniqid(time())));
$header = "From:$from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed; boundary=$boundary";
$header .= "\n\nThis is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format";
$header .= "\n--$boundary";
$header .= "\nContent-Type: text/plain";
$header .= "\nContent-Transfer-Encoding: 8bit";
$header .= "\n\n$text";
$file_content = fread(fopen($file,"r"),filesize($file));
$file_content = chunk_split(base64_encode($file_content));
$header .= "\n--$boundary";
$header .= "\nContent-Type: application/octetstream; name="$file_name"";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment; filename="$file_name"";
$header .= "\n\n$file_content";
$header .= "\n--$boundary--";
//$text,$subject und $recipient werden vom Formular übergeben via POST_Vars
mail($recipient,$subject,$text,$header);
Geht nicht. Keine Ahnung mehr.
Vielen Dank für Eure Hilfe.
Wenn jemand einen Link zu nem passenden Thread hat/findet, bitte posten. Ich hab noch nix passendes gefunden.
DANKE!
Hallo Tom
entschuldigt bitte, dass ich schon wieder diese Frage stelle. (Die anderen Threads habe ich schon gesichtet und nichts pssendes gefunden)...
Ist nicht zu entschuldigen.
FAQ kennen ist quasi Pfilcht hier.
Bleib in Dein Thread, lege Dir einen Namen zu der Dich von dem anderen Tom abgrenzt.
Und benutze das Archiv.
http://forum.de.selfhtml.org/faq/#Q-11
TomIRL
Hallo nochmal,
Ist nicht zu entschuldigen.
Oops!?!
Bleib in Dein Thread, lege Dir einen Namen zu der Dich von dem anderen Tom abgrenzt.
Hab kein eigenes Thread jemals geschrieben. It's my first time....
Und benutze das Archiv.
Hab ich, aber nix passendes gefunden!
Tom1tk
Hallo nochmal,
Ist nicht zu entschuldigen.
Oops!?!
Bleib in Dein Thread, lege Dir einen Namen zu der Dich von dem anderen Tom abgrenzt.
Hab kein eigenes Thread jemals geschrieben. It's my first time....
Siehste, zu unrecht angesch... weil man die Namen nicht aueinanderhalten kann.
Dann helfe ich Dir mal:
[pref:t=65323&m=371800]
Wird genau Dein Problem schon diskutiert.
Kannste Dich also gleich mit reinhängen.
TomIRL
Hello,
ich hatte Dir das vorhin schon geschrieben, dass Chunk_split() bei base64-Codierten Attachments für SMTP nicht mit \r\n sondern mit \n arbeiten muss. Sonst gibts Knoten in den Mailservern.
Und außerdem würde ich $text rauslassen aus der Mail-Funktion und diesen ebenfalls über den header übergeben. Es war für mich bisher nicht nachvollziehbar, wie sonst die übrigen Header-Zeilen aufgebaut werden. Insbesondere, wie man multipart/mixed oder multipart/related sonst übergeben soll, wenn vorher schon text/plain erzeugt wird durch die mail-Funktion.
Auf die passende Schachtelung kommt es jedenfalls an.
Grüße
Tom
Hello,
ich hatte Dir das vorhin schon geschrieben, dass Chunk_split() bei base64-Codierten Attachments für SMTP nicht mit \r\n sondern mit \n arbeiten muss. Sonst gibts Knoten in den Mailservern.
Und außerdem würde ich $text rauslassen aus der Mail-Funktion und diesen ebenfalls über den header übergeben. Es war für mich bisher nicht nachvollziehbar, wie sonst die übrigen Header-Zeilen aufgebaut werden. Insbesondere, wie man multipart/mixed oder multipart/related sonst übergeben soll, wenn vorher schon text/plain erzeugt wird durch die mail-Funktion.
Nee der Tom ist neu.
Heute ist es wieder mal zum vert(k)omen.
Ich dacht auch...
TomIRL
Hello nochmal,
Geht nicht. Keine Ahnung mehr.
Vielen Dank für Eure Hilfe.
Wenn jemand einen Link zu nem passenden Thread hat/findet, bitte posten. Ich hab noch nix passendes gefunden.
Ich habe auch ne fertige Funktion. Die kann sogar HTML-Seiten senden und ersetzt die enthaltenen Images. Ich kann ihr auch einfach eine URL übergeben und die Seite dann als eMail versenden.
Was nur überhaupt noch nicht klappt: Bilder NUR als Attachment versenden. Kann man ruhig angeben, die Mailclients zeigen die Dinger trotzdem an.
Hat aber auch 14 Tage gedauert, bis die ganzen Ungereimtheiten aus dem verschiedenen Manuals raus waren.
Nochmal Grüße
Tom
Tom
Welcher?
Hello,
Tom
Welcher?
Na ich natürlich!
Müsstest Du als alter Selfer doch sehen.
Die Fainhaiten, oder waren es die Feinheiten?
Grüße
Tom
Die Fainhaiten, oder waren es die Feinheiten?
Na ich hatte mich schon gewundert!
Sach mal hast Du was mit bitc(k?)om zu tun oder zu tun gehabt?
TomIRL
Hallo nochmals.
Vielen Dank für Eure Hilfe, aber kann sich jemand mal den Code unten nochmals anschauen:
$file = "$anhang";//Wird vom Forumlar als String E://bla/bla.jpg übergeben
$file_name = $anhang;//dto
$boundary = strtoupper(md5(uniqid(time())));
$header = "From:$from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed; boundary=$boundary";
$header .= "\n\nThis is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format";
$header .= "\n--$boundary";
$header .= "\nContent-Type: text/plain";
$header .= "\nContent-Transfer-Encoding: 8bit";
$header .= "\n\n$text";
$file_content = fread(fopen($file,"r"),filesize($file));
$file_content = chunk_split(base64_encode($file_content));
$header .= "\n--$boundary";
$header .= "\nContent-Type: application/octetstream; name="$file_name"";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment; filename="$file_name"";
$header .= "\n\n$file_content";
$header .= "\n--$boundary--";//$text,$subject und $recipient werden vom Formular übergeben via POST_Vars
mail($recipient,$subject,$text,$header);
Vielleicht kann ja jemand mal den Code ober korrigieren. Es hilft mir nicht weiter, Links zu anderen Threads (bei denen ähnliches aber nicht das gleiche diskutiert wird) zu posten. Ich bin php Neuling und kann mit .... base64-Codierten Attachments ... nix anfangen. (Dieses Thread hab ich übrigen auch schon gelesen. War damals ne Tussi, die Probleme hatte...)
Ich wäre Euch echt sehr dankbar. Ich weiß, dass man so was nicht in nem Forum fragen sollte, aber bevor hier 1000Leute immer wieder fragen, wie das denn geht mit dem multipart-Mailen könnte doch jemand mal nen einfachen (nicht mit WAAAAHNSINNS-function ausgestatteten) Quelltext posten.
Das wär doch mal ne Idee.
Danke im Vorraus, und bitte zerreißt mich jetzt nicht.
Greets Tom1tk
Hello,
Vielen Dank für Eure Hilfe, aber kann sich jemand mal den Code unten nochmals anschauen:
Also gut, das letzt Mal jetzt aber:
$file_name = $anhang;//dto
$boundary = strtoupper(md5(uniqid(time())));
$header = "From:$from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed; boundary="$boundary"";
$header .= "\n\nThis is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format";
$header .= "\n--$boundary";
$header .= "\nContent-Type: text/plain";
$header .= "\nContent-Transfer-Encoding: 8bit";
$header .= "\n\n$text";
$fh = fopen($file,"r");
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n--$boundary";
$header .= "\nContent-Type: application/octetstream;".
"name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;".
"filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
$header .= "\n--$boundary--";
//$text,$subject und $recipient werden vom Formular übergeben via POST_Vars
mail($recipient,$subject,$text,$header);
$ok = mail($recipient,$subject,,$header);
in der Mail-Funktion darf $text nicht nochmal angegeben werden.
Vielleicht kann ja jemand mal den Code ober korrigieren. Es hilft mir nicht weiter, Links zu anderen Threads (bei denen ähnliches aber nicht das gleiche diskutiert wird) zu posten. Ich bin php Neuling und kann mit .... base64-Codierten Attachments ... nix anfangen. (Dieses Thread hab ich übrigen auch schon gelesen. War damals ne Tussi, die Probleme hatte...)
Ich würde das mal nicht so negativ sagen. Jetzt ist es eben ein Tusser, der Probleme hat. Natürlich auch nicht negativ gemeint ;-))
So, nun baust Du noch eine schöne Funktion um alles drum herum
mime_mail($from, $to=array(), $attach=array(), $cc=array(), $bcc=array())
{
# Prüfen, ob in den Arrays was drinsteht
# Attachments vorbereiten, soviele, wie da sind
# Fehler auswerten nicht vergessen
# ---> hier ist Deine Arbeit nun gefragt <---
return $ok; # könnte auch ein array mit Fehlermeldungen sein.
}
Und wenn die Funktion erfolgreich erprobt sit, dann stellst Du sie hier zur Verfügung, für die Tausende die immer so tussig fragen ;-)
Grüße
Tom
Hallo Tom,
und wie gehts dann mit 2 oder mehr Attachments??
mit array und foreach oder mit ner Anzahl an Attachments und for($i.....)-Schleife??
Idee??
Hatte genau das Problem grad bei nem File-Upload. Konnte immer nur eine Datei hochladen.
Lösungen??
Thanx und Greets Tom1tk
Hello,
und wie gehts dann mit 2 oder mehr Attachments??
mit array und foreach oder mit ner Anzahl an Attachments und for($i.....)-Schleife??
Idee??
Nicht nur Idee. Ich habe Dir den Lösungsweg skizziert, fast schon in Farbe...
Selbstverständlich mit den intelligenten "Array"-Funktionen von PHP und nicht mit vorgegebenen Parametern. Immer alles schön offen halten. Die Subfunction muss selbst erkennen, wieviele Elemente das Array hat, ob es sich um Ressourcen auf fremden Servern oder um Dateien auf dem eigenen Dateisystem handelt, ob das Ding zu öffnen ist, ob es zu groß ist (Da sollte man vielleicht eine Konstante MAXATTACHSIZE einführen). Fehlermeldungen kann man dann auch in einem Array sammeln und entweder als Rückgabewert der Gesamtfunktion oder als Call-By-Reference (&$err) einbinden.
Der Verwender der Hüllfunktion sollte dann nix weiter wissen müssen, als welches Parameterarray welche Funktion hat.
Ich hab Dir die entsprechende Passage doch extra schon in ein if() gepackt. Mach einfach eine Schleife draus (foreach()) Musst natürlich vorher trotzdem mit if() prüfen, ob das Array überhaupt definiert ist und ob es Elemente enthält.
Grüße
Tom
Hallo nochmals,
ich hab das grad mal ausprobiert. Es versendet alles, nur kein Attachment. Das Script gibt auch keine Fehlermeldung aus.
Idee, wo mein Fehler steckt??
<?
if ($action==versenden){
$from="$absender";
$recipient="$empfaenger";
$subject="$betreff";
$boundary = strtoupper(md5(uniqid(time())));
$header = "From:$from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed; boundary="$boundary"";
$header .= "\n\nThis is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format";
$header .= "\n--$boundary";
$header .= "\nContent-Type: text/plain";
$header .= "\nContent-Transfer-Encoding: 8bit";
$header .= "\n\n$text";
$fh = fopen($file,"r");
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n--$boundary";
$header .= "\nContent-Type: application/octetstream;"."name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;"."filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
$header .= "\n--$boundary--";
//$text,$subject und $recipient werden vom Formular übergeben via POST_Vars
//mail($recipient,$subject,$text,$header);
$ok = mail($recipient,$subject,"",$header);
if ($ok=="true"){print "Nachricht wurde versandt...";}
else{print "Konnte Nachricht nicht versenden...";}
} //Ende send==True
?>
<html>
<body>
<form action="index.php" method="get" target="_blank">
Empfänger: <input type="text" name="empfaenger"><br>
Absender: <input type="text" name="absender"><br>
Betreff: <input type="text" name="betreff"><br>
Text: <textarea name="text" rows="10" cols="50" WRAP="VIRTUAL"></TEXTAREA><br>
Attachment: <input type="file" name="file"><br>
<input type="submit" value="versenden" name="action">
</body>
</html>
Danke für Eure Tipps
Tom1tk
ReHallo,
Also außer dass mich persönlich die Methode get gestört hat und ein Fehlendes Leerzeichen nach dem From: konnte ich keinen wesentlichen Fehler entdecken. Aber soll ja nix heißen.
Probiers nochmal mit dem Leerzeichen nach "From: "
Hast Du denn alle Fehlermeldungen eingeschalet zum Testen?
Hast Du register_globals ausgeschaltet?
Und lass das Script nicht auf einem öffentlich zugänglichen Server ohne Zugangskontrolle rumfliegen. Sonst hast Du ein Open Relay gebaut.
<?php #### mimemail.php ###
ini_set("error_reporting","E_ALL");
if ($_POST["action"]=="versenden")
{
$from = $_POST["absender"];
$recipient = $_POST["empfaenger"];
$subject= $_POST["betreff"]; ## darf nur ASCII 0-127 sein!
## müsstest Du nochmal eine Kastrierfunktion für bauen.
$boundary = strtoupper(md5(uniqid(time())));
$header = "From: $from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed; boundary="$boundary"";nach den zwei Zeilenschaltungen beginnt der Mailbody
$header .= "\n\nThis is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format";
nach dieser Boundary beginnt der erste Mime-Teil
$header .= "\n--$boundary";
$header .= "\nContent-Type: text/plain";
$header .= "\nContent-Transfer-Encoding: 8bit";20 nach wieder zwei Zeilenschaltungen beginnt der Body dieses
Abschnitts. Und das ist der Plain-Text.
$header .= "\n\n$text";
hier wird das Attachment vorbereitet.
$fh = fopen($file,"r");
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n--$boundary";
$header .= "\nContent-Type: application/octetstream;"."name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;"."filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
$header .= "\n--$boundary--";//$text,$subject und $recipient werden vom Formular übergeben via POST_Vars
//mail($recipient,$subject,$text,$header);$ok = mail($recipient,$subject,"",$header);
if ($ok=="true"){print "Nachricht wurde versandt...";}
else{print "Konnte Nachricht nicht versenden...";}
} //Ende send==True
?><html>
<body>
<form action="mimemail.php"
method="post"
enctype="multipart/form-data"
target="_blank">
<!-- multipart/form-data im weisen Vorgriff auf den Fileupload -->
Empfänger: <input type="text" name="empfaenger"><br>
Absender: <input type="text" name="absender"><br>
Betreff: <input type="text" name="betreff"><br>
Text: <textarea name="text" rows="10" cols="50" WRAP="VIRTUAL"></TEXTAREA><br>
Attachment: <input type="file" name="file"><br>
<input type="submit" value="versenden" name="action">
</body>
</html>
Wenn es nun nicht funktioniert und die Anderen keine Lust mehr haben, nochmal zu schauen, dann bin ich mit meinem PHP für heute auch am Ende.
Liebe Grüße
Tom
Hello,
Nachtrag:
vor den Boundaries erzeugen die Mailerprogramme immer eine echte Leerzeile. Das habe ich in meiner eigenen Funktion auch so eingehalten.
Bau die doch nochmal ein.
Grüße
Tom
Hello ich nochmal,
$boundary = strtoupper(md5(uniqid(time())));
$header = "From: $from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed;\nboundary="$boundary"";
So korrekt mit der Leerzeile??
Jetzt verschickt der die Mail mit Attachment, aber als blabla.dat???
Die Foreach-Schleife:
Wo muss die Straten, wo enden??
##Hier Beginn foreach???
$fh = fopen($file,"r");
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n--$boundary";
$header .= "\nContent-Type: application/octetstream;"."name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;"."filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
#Kommt hier das ende foreach hin??
$header .= "\n--$boundary--";
Danke, Tom1tk
Ach ja, das ist mein header:
From: ab@1tk.de MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="FA93224564149F0707DB1AD3625A4088" This is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format --FA93224564149F0707DB1AD3625A4088 Content-Type: text/plain Content-Transfer-Encoding: 8bit dsrgaedsf --FA93224564149F0707DB1AD3625A4088 Content-Type: application/octetstream;name="" Content-Transfer-Encoding: base64 Content-Disposition: attachment;filename="" --FA93224564149F0707DB1AD3625A4088--
Danke, Tom1tk
Hello,
um den im Browser auszugeben, hättest Du ihn vorher noch behandeln sollen. So sieht man nix.
entweder
echo "<pre>";
echo htmlentities($header);
echo "</pre>";
oder
echo nl2br(htmlentities($header));
Grüße
Tom
Hello, wird wohl doch ne längere Sache... :-)
$boundary = strtoupper(md5(uniqid(time())));
$header = "From: $from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed;\nboundary="$boundary"";So korrekt mit der Leerzeile??
Hier war sie jetzt nicht notwendig, de es die Definition der Boundary ist. Dürfte aber auch nicht schädlich sein.
Jetzt verschickt der die Mail mit Attachment, aber als blabla.dat???
Die Foreach-Schleife:
Wo muss die Straten, wo enden??
hier wird das Attachment vorbereitet.
##Hier Beginn foreach???
Ja.
Erst prüfen, ob $attach überhaupt ein Array ist:
if (is_array($attach))
{
foreach($attach as $filename)
{
$fh = @fopen($filename,"r"); ## da war noch ein Fehler (file->filename)
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n\n--$boundary"; ## hier die Leerzeilen
$header .= "\nContent-Type: application/octetstream;"."name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;"."filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
else
{
$err[] = "Attachment File ".$filename." ließ sich nicht öffnen";
}
} ## end foreach()
} ## endif isarray
else
{
$err[] = "Attachment fehlt.";
}
$header .= "\n\n--$boundary--";
Mach mitte nochmal eine saubere Funktion mit den Übergabe-Arrays draus und wenn sie funktioniert, dann poste sie nochmal.
Viel Erfolg
Tom
Halloa und schönen guten Abend!
Hello, wird wohl doch ne längere Sache... :-)
Entschuldige bitte....
Also: Die Attachments werden verschickt, aber es kommt nur ne*.dat-Datei an. Die Inhalte dieser Dat-Datei passen (umbennenen und überprüft!!) Das geht also, nur heißt die Datei noch falsch??
Was an dem Code sonst noch verbesserungswürdig (ausser sicherheitsabfragen und dergleichen). Ist hier nur vereinfacht zum testen.
Ach ja, dieses eine Leerzeichen bewirkte, dass meine Attachments als Plain-Text versendet wurden.
Was oder für was ist eigentlich die boundary?
VIELEN Dank, weils auch schon so oft gepostet wurde (aber nie richtig fertig ausdiskuiert wurde!!)
Greets
Code:
<?
if ($action==versenden){
$from="$absender";
$recipient="$empfaenger";
$subject="mail-test";
$boundary = strtoupper(md5(uniqid(time())));
$header = "From: $from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed; boundary="$boundary"";
$header .= "\n\nThis is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format";
$header .= "\n--$boundary";
$header .= "\nContent-Type: text/plain";
$header .= "\nContent-Transfer-Encoding: 8bit";
$header .= "\n\n$text";
#$header .= "\n\n$text";
/*###### Hier ohne Array #########################
$fh = fopen($file,"r");
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n--$boundary";
$header .= "\nContent-Type: application/octetstream;"."name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;"."filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
#####################*/
if (is_array($attach))
{
foreach($attach as $filename)
{
$fh = @fopen($filename,"r"); ## da war noch ein Fehler (file->filename)
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n\n--$boundary"; ## hier die Leerzeilen
$header .= "\nContent-Type: application/octetstream;"."name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;"."filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
else
{
$err[] = "Attachment File ".$filename." ließ sich nicht öffnen";
}
} ## end foreach()
} ## endif isarray
else
{
$err[] = "Attachment fehlt.";
}
###Ende Vorbereitung
$header .= "\n--$boundary--";
$ok = mail($recipient,$subject,"",$header);
if ($ok=="true"){print "Nachricht wurde versandt...<br><br>";}
else{print "Konnte Nachricht nicht versenden...<br><br>";}
print $header."<br><br>";#Nur kontrolle
print $file."<br><br>";#nur kontrolle
} //Ende send==True
?>
<html>
<body>
<form action="index.php" method="post" enctype="multipart/form-data" target="_blank">
<form action="index.php" method="post" target="_blank">
Empfänger: <input type="text" name="empfaenger" value=""><br>
Absender: <input type="text" name="absender" value=""><br>
Text: <textarea name="text" rows="10" cols="50" WRAP="VIRTUAL"></TEXTAREA><br>
Attachment: <input type="file" name="attach[]"><br>
Attachment: <input type="file" name="attach[]"><br>
<input type="submit" value="versenden" name="action">
</body>
</html>
Hello,
nun hast Du mehr Fehler reingebaut als raus.
Vor allem hast Du die wieder reingebaut, die ich Dir schon rausgesucht hatte.
Ich schlage mal vor, Du kopierst Dir mal alle Versionen mit Zeitstempel der reihe nach in einen vernünftigen Quellcode-Editor und vergleichst dann nochmal.
Ich weigere mich, mit register_globals=on zu arbeiten.
Stell mal die letzte von mir korrigierte Version mit allen Features zusammen, abu eine Funktion drum und dann sehen wir weiter.
Die Boundaries sind dafür da, dass der eigentlich sehr dumme Mailer die einzelnen Bereiche voneinander unterscheiden kann. Ist ja alles irgendwie textorientiert.
Wer sich diesen Schwachsinn mal ausgedacht hat, weiß ich nicht.
Grüße
Tom
Hi nochmals,
Ich weigere mich, mit register_globals=on zu arbeiten.
Warum? Hat das Nachteile? Welche Fehler meinst Du?? Ich hab lediglich das mit _POST usw. rausgelassen, da mein Server das auch ohne blickt.
Bitte sei mir nicht böse, bin Anfänger => hab keine Erfahrungen.
Danke für deine Hilfe,
Tom1tk
Ich bau das schnell mal um in den Code, wie Du es machen wolltest und dann poste ich den hier in der Hoffnung, dass Du mir nochmals hilfst!!
D A N K E
Aber jetzt:
Hallo erstmal!
(hoffentlich die letzte Runde)
Also: Hab alle Argumente mit eingebaut, die Du mir genannt hattest. Attachment wird versendet, es kommt aber immer noch nur eine Datei namens "php2PqQ7h.dat" (bzw. zwei oder mehr) mit an.
B I T T E B I T T E nochmals um deine Hilfe:
<?
if ($_POST["action"]=="versenden")
{
$from = $_POST["absender"];
$recipient = $_POST["empfaenger"];
$subject= $_POST["betreff"];
$boundary = strtoupper(md5(uniqid(time())));
$header = "From: $from\n"; //kommt von Formular
$header .= "MIME-Version: 1.0";
$header .= "\nContent-Type: multipart/mixed; boundary="$boundary"";
$header .= "\n\nThis is a multi-part message in MIME format -- Dies ist eine mehrteilige Nachricht im MIME-Format";
$header .= "\n--$boundary";
$header .= "\nContent-Type: text/plain";
$header .= "\nContent-Transfer-Encoding: 8bit";
$header .= "\n\n$text";
/*###### Ohne Array #########################
$fh = fopen($file,"r");
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n--$boundary";
$header .= "\nContent-Type: application/octetstream;"."name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;"."filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
#####################*/
###Jetzt mit array####################################
if (is_array($attach))
{
foreach($attach as $filename)
{
$fh = @fopen($filename,"r"); ## da war noch ein Fehler (file->filename)
if ($fh)
{
$file_content = fread($fh,filesize($filename));
fclose($fh);
$file_content = chunk_split(base64_encode($file_content),76,"\n");
$header .= "\n\n--$boundary"; ## hier die Leerzeilen
$header .= "\nContent-Type: application/octetstream;"."name="".basename($filename).""";
$header .= "\nContent-Transfer-Encoding: base64";
$header .= "\nContent-Disposition: attachment;"."filename="".basename($filename).""";
$header .= "\n\n$file_content\n";
}
else
{
$err[] = "Attachment File ".$filename." ließ sich nicht öffnen";
}
} ## end foreach()
} ## endif isarray
else
{
$err[] = "Attachment fehlt.";
}
###Ende Vorbereitung
$header .= "\n--$boundary--";
$ok = mail($recipient,$subject,"",$header);
if ($ok=="true"){print "Nachricht wurde versandt...<br><br>";}
else{print "Konnte Nachricht nicht versenden...<br><br>";}
echo "<pre>";
echo htmlentities($header);
echo "</pre>";
print $file."<br><br>";
} //Ende send==True
?>
<html>
<body>
<form action="index.php" method="post" enctype="multipart/form-data" target="_blank">
<form action="index.php" method="post" target="_blank">
Empfänger: <input type="text" name="empfaenger" value=""><br>
Absender: <input type="text" name="absender" value=""><br>
Text: <textarea name="text" rows="10" cols="50" WRAP="VIRTUAL"></TEXTAREA><br>
Attachment: <input type="file" name="attach[]"><br>
Attachment: <input type="file" name="attach[]"><br>
<input type="submit" value="versenden" name="action">
</body>
</html>
Vielen Dank, Tom1tk
Hello,
habe das kleine Maime-Mail-Script jetzt überarbeitet und getestet.
Ich hoffe, dass keine großen Schnitzer mehr drin sind.
Man könnte noch einige Verbesserungen einbauen.
Über fachkundige Anregungen freue ich mich daher.
http://bitworks.de/~selfHTML/mime_mail.php
Viel Spaß damit
Grüße
Tom
Hello,
habe das kleine Maime-Mail-Script jetzt überarbeitet und getestet.
Ich hoffe, dass keine großen Schnitzer mehr drin sind.
Man könnte noch einige Verbesserungen einbauen.Über fachkundige Anregungen freue ich mich daher.
http://bitworks.de/~selfHTML/mime_mail.php.txt
Viel Spaß damit
Grüße
Tom
Hello,
habe noch einen Fehler gefunden, der auf dem Client (OE 5.5) immer zum out-of-memory führte. Das kleine Mime-Mail-Script ist jetzt innder Version vom 03.12.2003 00:42 auf dem Server.
Über weitere Verbesserungen oder z.B. bessere Kommentierung hätte ich nix einzuwenden
http://bitworks.de/~selfHTML/mime_mail.php.txt
Viel Spaß damit
Grüße
Tom
Hallo,
Danke Tom für deine Hilfe.
Die Datei muss dann *.php heißen und nicht *.php3 o.ä. Hat bei mir mit *.php3 nicht funktioniert.
Greets
Hello,
Danke Tom für deine Hilfe.
Bitte. Habe da auch nochmal was wiederholen können.
Die Datei muss dann *.php heißen und nicht *.php3 o.ä. Hat bei mir mit *.php3 nicht funktioniert.
php3 ist ja auch schon ein paar Tage her. Da ging foreach() noch nicht, $_POST & Co. und viele andere spannende Sachen mit Arrays
Die Version für dieses Script sollte schon PHP >= 4.3.x sein
Grüße
Tom
Nochmal ich::
<<<<<Sonst hast Du ein Open Relay gebaut.
Warum nicht??? Und was ist ein open Relay???
Thanx Tom1tk
Hello
<<<<<Sonst hast Du ein Open Relay gebaut.
Warum nicht??? Und was ist ein open Relay???
Das ist ein Mailserver, den es nicht interessiert, wer über ihn Mails verschickt. Das mögen die Spammer ganz besonders gerne, solche Seiten zu finden. Das geht dann auf DEine Rechnung und ggf. auch auf Deine Verantwortung.
Am Besten, Du baust gleich noch ein Password-Feld ein. Password und Mailadresse des Absenders müssen zusammenpassen, sonst gibts vom Formular nur ein höhnisches Grinsen zurück...
Grüße
Tom