![]() |
[PHP] Email senden
Ich bastele gerade an einem Feedback Formular für meine Homepage. Das klappt auch schon ganz gut, bis auf die Tatsache, dass es ziemlich bescheiden formatiert ankommt.
Mein PHP Code sieht bisher so aus:
Code:
Und das Resultat:
<?php
$to = 'mpuff@luckie-online.de'; $headers = 'MIME-Version: 1.0\r\n'. 'Content-Type: text/plain; charset=iso-8859-1\r\n'. 'From: "Kontaktformular luckie-online.de" <'.$from.'>\r\n'. 'To: '.$to.' <'.$to.'>\r\n'. 'Date: '.date("r").'\r\n'. 'Subject: '.$subject.'\r\n'; $msg = 'Von: '.$yourname.' ('.$from.')\r\n\r\nText:\r\n'.$text; if (!mail($to, $subject, $msg, $headers)) { echo 'Fehler'; } else { echo 'und weg.'; } ?> Zitat:
Hier mal der Header, der gesendeten E-Mail:
Code:
Return-Path: <apache@www.zeus03.de>
X-Original-To: [email]mpuff@luckie-online.de[/email] Delivered-To: [email]l3s11195p3@www.zeus03.de[/email] Received: by [url]www.zeus03.de[/url] (Postfix, from userid 48) id 793F3108A7381; Mon, 7 Nov 2005 09:57:36 +0100 (CET) To: [email]mpuff@luckie-online.de[/email] Subject: Hallo MIME-Version: 1.0\r\nContent-Type: text/plain; charset=iso-8859-1\r\nFrom: "Kontaktformular luckie-online.de" <mpuff@gmx.de>\r\nTo: [email]mpuff@luckie-online.de[/email] <mpuff@luckie-online.de>\r\nDate: Mon, 7 Nov 2005 09:57:36 +0100\r\nSubject: Hallo\r\n Message-Id: <20051107085736.793F3108A7381@www.zeus03.de> Date: Mon, 7 Nov 2005 09:57:36 +0100 (CET) From: [email]apache@www.zeus03.de[/email] (apache) Status: |
Re: [PHP] Email senden
Liste der Anhänge anzeigen (Anzahl: 1)
Ich verwende dafür eine nette kleine E-Mail-Klasse.... Diese unterstützt auch HTML und Plain-Text-Mails.
Hoffe das hilft Dir ein wenig! |
Re: [PHP] Email senden
Ächtz, ich will nur ein Formular ausfüllen und per mail() verschicken. Mehr nicht.
Und häng bitte den Code als Datei an, über 1200 Zeilen Code in einem Beitrag müssen nun wirklich nicht sein. :roll: |
Re: [PHP] Email senden
Zitat:
achte bitte dadrauf das $headers von aussen nicht manipulibar ist. sonst machst du dir ein offenes spamgateway. |
Re: [PHP] Email senden
Damit funktionierts aber.... Ich hab die SMTP-Class mal wieder raus genommen... Die brauchst du nicht! Mit der Klasse weiß ich aber das es geht ;-)
|
Re: [PHP] Email senden
Ah, danke, das war schon mal gut. Aber die Zeilenumbrüche im Text sind immer noch fehlerhaft und die Hochkomata werden imme rnoch "escaped".
|
Re: [PHP] Email senden
Zitat:
Zitat:
in PHP werden String-Literale mit " (Doppelgänsefuss) eingefasst, nicht wie in Delphi mit ' ich habe das kurz gestestet... der Effekt von escapeten Sonderzeichen und nicht deescapten Zeilenumbrüchen ist so reproduzierbar so ist's richtig:
Code:
(Subject kannst weglassen, das wird bereits bei mail() gesetzt...)
<?php
$headers = "MIME-Version: 1.0\r\n". "Content-Type: text/plain; charset=iso-8859-1\r\n". "From: \"Kontaktformular luckie-online.de\" <".$from.">\r\n". "To: ".$to." <".$to.">\r\n". "Date: ".date("r")."\r\n"; ?> |
Re: [PHP] Email senden
Zitat:
Die Mail mit deinem Header sieht übrigens genauso aus: Zitat:
|
Re: [PHP] Email senden
ein \r\n wird nur in "-strings interpoliert. in '-strings sin sie literal wie alle anderen buchstaben.
|
Re: [PHP] Email senden
Ich habe das bisher auf meinem Freedback formular so gemacht:
Code:
Und die Umbrüche funktionieren.$message = 'Name :' . $name . "\n" . 'E-mail :' . $email . "\n" . 'Comment :' . $kcmment . "\n" . 'server time -> ' . $mytime; |
Re: [PHP] Email senden
probier mal
stripslashes(text) addslashes(text) gruß |
Re: [PHP] Email senden
stripslashes entfernt nur die Backslashes, so dass dann das bei rauskommt:
Zitat:
|
Re: [PHP] Email senden
probier mal nur
addslashes(text) sorry, hab mich da weng blöd ausgedrückt. nicht beides hintereinander. |
Re: [PHP] Email senden
Also, die Lösung von ripper löst schon mal das Problem mit den Zeilenumbrüchen. Nur das mit den "escapen" habe ich nochnicht hinbekommen:
Zitat:
Zitat:
Zitat:
Besten dank. :thumb: So sieht es jetzt aus: ![]() Und das Script dazu:
Code:
Ist der Header so wasserdicht oder kann da jemand das Formular missbrauchen? Es wäre nett, wenn ein, zwei mir mal eine Testmail darüber schicken und mir Rückmeldung geben würden.
<?php
/* Copyright (c) 2005: Michael Puff Url: [url]http://www.luckie-online.de[/url] Mail: [email]mpuff@luckie-online.de[/email] Version: 1.0 - 2005-11-07 */ $to = 'mpuff@luckie-online.de'; $headers = "MIME-Version: 1.0\r\n". "Content-Type: text/plain; charset=iso-8859-1\r\n". "From: \"Kontaktformular luckie-online.de\" <".$from.">\r\n". "To: ".$to." <".$to.">\r\n". "Date: ".date("r")."\r\n"; $msg = 'Von: '."\n".$yourname.' <'.$from.'>'."\n\n".'Text:'."\n".$text; $msg = stripslashes($msg); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Homepage von Michael Puff</title> <link rel="stylesheet" type="text/css" href="/css/dir.css"> </head> <body> <h1>Homepage von Michael Puff</h1> <?php $dir = getcwd(); $start = strpos(strtolower($dir), '/html/')+5; $s = substr($dir, 0, $start); include $s.'/includes/nav.shtml'; include $s.'/includes/copyright.inc'; ?> <h2>E-Mail senden</h2> [img]/pics/line.png[/img] <?php if (empty($from) || empty($text)) { echo "Bitte füllen Sie mindestens die Felder 'E-Mail Adresse' und 'Text' aus."; } else if (!mail($to, $subject, $msg, $headers)) { echo ' Es ist ein Fehler beim Senden der E-Mail aufgetreten.</p>'; } else { echo ' Die E-Mail wurde erfolgreich gesendet.</p>'; } ?> [img]/pics/line.png[/img] <table class="tblfooter"> <tr> <?php echo '<td class="total"></td>'.'<td class="copy">'.$cr.'</td>'; ?> </tr> </table> </body> </html> [edit=Admin]Code-Tags korrigiert. Mfg, Daniel[/edit] |
Re: [PHP] Email senden
So, irgend eine nette namenlose Person hat mir eine Mail geschrieben. Oder sie war nicht nett und wollte mich nur ärgern. jedenfalls scheint es zu funktionieren. Kan mir mal jemand sagen, wie sicher das jetzt mit dem obigen Code ist?
|
Re: [PHP] Email senden
sicher.
zwar kann dir jeder alles moegliche schicken und dich evtl sogar vollspammen, aber das ist keine frage von sicher/unsicher mehr. |
Re: [PHP] Email senden
In wie fern sicher?
Und du solltest dir angewöhnen die globalen Arrays $_GET und $_POST (in deinem Fall letzteres, da du die Daten aus dem Formular ja wohl auch per "post" abschickst, $_GET wäre für Daten, die über die URL kommen). Also bspw. $_GET['text'] statt $text. Zumal du so auch auf der sicheren Seite bist, falls deine Scripte mal auf einem Server laufen sollen, auf dem die Einstellung register_globals auf "off" gestellt wurde, denn dort sind die Werte nur üer globalem Array erreichbar. Infos dazu auch bspw. ![]() |
Re: [PHP] Email senden
Zitat:
![]() ![]() |
Re: [PHP] Email senden
Luckie: wenn du noch Pr0gs tipp beherzigst ($_GET/$_POST/$_REQUEST/...), dann ist das script wirklich in ordnung.
|
Re: [PHP] Email senden
Zitat:
|
Re: [PHP] Email senden
So gerade wurde von einem netten Forumsteilnehmer mein Script geknackt mit diser HTML Datei:
Code:
Die Mail ging sowohl an mich, als auch an den anderen Forumsteilnehmer, was ja eigentlich nicht sein sollte.
<html>
<form ACTION="http://www.luckie-online.de/php/mail.php" METHOD=POST> Ihre E-Mail Adresse: <textarea NAME="from" COLS=60 ROWS=15>test@tester.de> To: Tester <xyzabc@foob.ar> Date: Sat, 22 Oct 2005 16:50:53 +0200 . </textarea> Ihr Name: <input NAME="yourname" size=35> Betreff: <input NAME="subject" size=35> Ihr Text: <textarea NAME="text" COLS=60 ROWS=15> diese mail solltest du gar nicht bekommen, sorry, falls es viele versuchen und du zu gespamt wirst..., bei mir bleibt es bei diesem einen test! versprochen... Gruß Peter </textarea> <input TYPE="submit" VALUE="Senden"> </form> </html> Den Tipp von Pr0gs habe ich noch nicht eingebaut, hätte der das verhindert? Alös erstes werde ich die Variable $to zu einer Konstanten machen, damit man diese schon mal nicht überschreiben kann. Puh, jetzt sieht man mal, wie schwer es ist solche Sachen wasserdicht zu bekommen, dabei ist das ja noch recht einfach und übersichtlich. :-? |
Re: [PHP] Email senden
es nuetzt nichts, die konstant zu machen.
du musst alle eingaben parsen, also die eingegebenen emailadressen des users zerlegen und auf richtigkeit pruefen. wie du siehst, hat er da weitere header eingeschmuggelt. edit: aeh unfug. $from musst du im code festlegen. sonst kann ja wie gesehen jeder irgendwas reingeben. |
Re: [PHP] Email senden
Mein Vorschläge hätte das Umgehen auch nur verhindert, wenn die register_globals Einstellung auf dem Sever auf "off" gestanden hätte (was sie ja nicht ist, sonst könnte dein Script in jetziger Form nicht funktionieren), da dann kein Zugriff mehr von außen auf die Variablen möglich ist.
Auch unterscheidest du momentan ja nicht zwischen GET und POST Daten, daher hätte man sich das Formular auch fast sparen können und eine Mail nur per Aufruf des Links mit passenden Parametern abschicktn können. |
Re: [PHP] Email senden
Zitat:
|
Re: [PHP] Email senden
ich würde $from gar nicht für den header verwenden, sondern einen vordefinierten absender benutzen...
@luckie: kannst du die gmx adresse bitte aus dem beitrag entfernen? |
Re: [PHP] Email senden
erstmal sorry, dass ich da oben so vorschnell "sicher." gesagt hab. hab deinen code nicht gruendlich genug gelesen.
also. alle daten, die von aussen kommen, sind der potenzielle tod fuer dein script. $from wolltest du dem script per aufruf fuettern, das hat dieser jemand von vor ein paar posts aufgedeckt und einen weg gezeigt, es auszunutzen. das kannst du erstmal fixen, indem du $post im script zuweist. eingaben von aussen zu pruefen ist schon schwierig. da geht man am besten nicht mit "einschraenken" vor, sondern mit "erlauben". beispiel username in einem forum: wuerde ich namen verbieten, die die sonderzeichen "!@#$%^&*()" enthalten, dann macht sich einer die muehe, andere sonderzeichen zu finden. erlaube ich stattdessen nur a-z, A-Z, 0-9 und leerzeichen und verlange mindestens 3-zeichen-lange nicks, dann ist das sicher. |
Re: [PHP] Email senden
![]() |
Re: [PHP] Email senden
OK, jetzt sieht das alles so aus:
Code:
Ist es jetzt etwas sicherer?
define("TO", "mpuff@luckie-online.de");
function validate_email($email) { // Create the syntactical validation regular expression $regexp = "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$"; // Presume that the email is invalid $valid = 0; // Validate the syntax if (eregi($regexp, $email)) { list($username,$domaintld) = split("@",$email); // Validate the domain if (getmxrr($domaintld,$mxrecords)) $valid = 1; } else { $valid = 0; } return $valid; } $headers = "MIME-Version: 1.0\r\n". "Content-Type: text/plain; charset=iso-8859-1\r\n". "From: \"Kontakt luckie-online.de\" <webmaster@luckie-online.de>\r\n". "To: ".TO." <".TO.">\r\n". "Date: ".date("r")."\r\n"; $msg = 'Name: '.$_POST['yourname']."\n". 'E-Mail: '.$_POST['from']."\n\n". 'Text:'."\n".$text; $msg = stripslashes($msg); ?> // ... <?php if ((empty($from) || empty($text)) || (!validate_email($_POST['from']))) { echo " Bitte füllen Sie mindestens die Felder 'E-Mail Adresse' und 'Text' aus und überprüfen Sie ihre E-Mail Adresse auf Gültigkeit.</p>"; } else if (!mail($to, $subject, $msg, $headers)) { echo ' Es ist ein Fehler beim Senden der E-Mail aufgetreten.</p>'; } else { echo ' Die E-Mail wurde erfolgreich gesendet.</p>'; } ?> |
Re: [PHP] Email senden
also ich sehe im moment nichts mehr. bis auf $subject, aber in wie weit, bzw. ob überhaupt man das missbrauchen kann,
dazu fehlen mir die php kenntnisse... |
Re: [PHP] Email senden
$subject wuerd ich auch im code festlegen.
von irgendwas ausgehen ist der erste schritt... moeglicherweise kann man so weitere header einbauen, wie das mit $from schon gemacht wurde... |
Re: [PHP] Email senden
Hm. Gut. Dann lasse ich es erstmal so. Besten Dank für eure Hilfe. Hier noch mal das komplette Script:
Code:
<?php
/* Copyright (c) 2005: Michael Puff Url: [url]http://www.luckie-online.de[/url] Mail: [email]mpuff@luckie-online.de[/email] Version: 1.1 - 2005-11-07 */ define("TO", "mpuff@luckie-online.de"); function validate_email($email) { // Create the syntactical validation regular expression $regexp = "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$"; // Presume that the email is invalid $valid = 0; // Validate the syntax if (eregi($regexp, $email)) { list($username,$domaintld) = split("@",$email); // Validate the domain if (getmxrr($domaintld,$mxrecords)) $valid = 1; } else { $valid = 0; } return $valid; } $headers = "MIME-Version: 1.0\r\n". "Content-Type: text/plain; charset=iso-8859-1\r\n". "From: \"Kontakt luckie-online.de\" <webmaster@luckie-online.de>\r\n". "To: ".TO." <".TO.">\r\n". "Date: ".date("r")."\r\n"; $msg = "Name : ".$_POST['yourname']."\n". "E-Mail : ".$_POST['from']."\n". "Betreff : ".$_POST['subject']."\n\n". $text; $msg = stripslashes($msg); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Homepage von Michael Puff</title> <link rel="stylesheet" type="text/css" href="/css/dir.css"> </head> <body> <h1>Homepage von Michael Puff</h1> <?php $dir = getcwd(); $start = strpos(strtolower($dir), '/html/')+5; $s = substr($dir, 0, $start); include $s.'/includes/nav.shtml'; include $s.'/includes/copyright.inc'; ?> <h2>E-Mail senden</h2> [img]/pics/line.png[/img] <?php if ((empty($from) || empty($text)) || (!validate_email($_POST['from']))) { echo " Bitte füllen Sie mindestens die Felder 'E-Mail Adresse' und 'Text' aus und überprüfen Sie ihre E-Mail Adresse auf Gültigkeit.</p>"; } else if (!mail($to, $_POST['subject'], $msg, $headers)) { echo ' Es ist ein Fehler beim Senden der E-Mail aufgetreten.</p>'; } else { echo ' Die E-Mail wurde erfolgreich gesendet.</p>'; } ?> [img]/pics/line.png[/img] <table class="tblfooter"> <tr> <?php echo '<td class="total"></td>'.'<td class="copy">'.$cr.'</td>'; ?> </tr> </table> </body> </html> |
Re: [PHP] Email senden
Ich würde dieses Sript auch gerne auf meiner Seite verwenden, nur weiß ich nicht wie ich es einbinde. Kann mir da jemand kurz helfen?
|
Re: [PHP] Email senden
*PUSH*
|
Re: [PHP] Email senden
Du brauchst eine HTML-Datei mit einer Form, die Daten dieser Form müssen dann an das PHP-Skript gehen.
|
Re: [PHP] Email senden
So, schöne Grüße von meinem Webhoster, das Script funktioniert nicht mehr so wie es soll. Heute Nacht hat mein Hoster irgendwas am Mailsystem gemacht, was hat er nicht gesagt, aber jeden falls zeigt mir Outlook nicht mehr an von wem die Mail ist. Im Webmail Interface wird alles korrekt angezeigt.
So sieht es zur Zeit aus:
Code:
Früher stand da immer in der "Von"-Spalte: Developer michael-puff.de jetzt ist sie aufeinmal leer. :wall:
<?php
/* Copyright (c) 2005: Michael Puff Url: [url]http://www.michael-puff.de[/url] Mail: [email]mpuff@michael-puff.de[/email] Version: 1.1 - 2005-11-07 */ define("TO", "mpuff@michael-puff.de"); function validate_email($email) { // Create the syntactical validation regular expression $regexp = "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$"; // Presume that the email is invalid $valid = 0; // Validate the syntax if (eregi($regexp, $email)) { list($username,$domaintld) = split("@",$email); // Validate the domain if (getmxrr($domaintld,$mxrecords)) $valid = 1; } else { $valid = 0; } return $valid; } $headers = "MIME-Version: 1.0\r\n". "Content-Type: text/plain; charset=iso-8859-1\r\n". "From: \"Developer michael-puff.de\" <mpuff@michael-puff.de>\r\n". "To: ".TO." <".TO.">\r\n". "Date: ".date("r")."\r\n"; $msg = "Name : ".$_POST['yourname']."\n". "E-Mail : ".$_POST['from']."\n". "Betreff : ".$_POST['subject']."\n\n". $text; $msg = stripslashes($msg); ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>michael-puff.de/E-Mail senden</title> <link rel="stylesheet" type="text/css" href="/css/stylesheet.css"> </head> <body> <div> <h1>Homepage von Michael Puff</h1> <?php $dir = getcwd(); $start = strpos(strtolower($dir), '/html/')+5; $s = substr($dir, 0, $start); include $s.'/includes/nav.shtml'; ?> <h2>E-Mail senden</h2> <?php if ((empty($from) || empty($text)) || (!validate_email($_POST['from']))) { echo " Bitte füllen Sie mindestens die Felder 'E-Mail Adresse' und 'Text' aus und überprüfen Sie ihre E-Mail Adresse auf Gültigkeit.</p>"; } else if (!mail($TO, $_POST['subject'], $msg, $headers)) { echo ' Es ist ein Fehler beim Senden der E-Mail aufgetreten.</p>'; } else { echo ' Die E-Mail wurde erfolgreich gesendet.</p>'; } ?> <hr> <table class="tblfooter"> <tr> <?php echo '<td class="left"></td>'; echo '<td class="right">Copyright © 2003 - '.date("Y").' [url="/impressum.php"]Michael Puff[/url]</td>'; ?> </tr> </table> </div> </body> </html> Und die Mail sieht jetzt so aus: Zitat:
Irgendwas läuft da schief. |
Re: [PHP] Email senden
Hat sich erledigt, der neue Dienst kommt mit \r\n nicht zurecht. Es muss strikt \n sein. Der alte hat es noch konvertiert. Jetzt geht alles wieder. ;)
|
Re: [PHP] Email senden
:warn: Die RFCs spezifizieren sowohl für POP als auch für SMTP \r\n als Zeilenendezeichen... Somit ist der Provider im Unrecht.
Obwohl ich nicht verstehe, was der Server dagegen hat, wenn an jedem Zeilenende \r steht :gruebel: |
Re: [PHP] Email senden
Was heißt unrecht? Das Programm ist höchstens nicht RFC konform, Recht hat der Hoster schon, wenn er sagt, dass das Mail-Programm mit \r\n nicht klar kommt.
|
Re: [PHP] Email senden
Jemand aus dem Webhosterforum meinte übrigens, dass das Script angreifbar wäre:
Zitat:
|
Re: [PHP] Email senden
Zeilenumbruch im Subject unterbinden, sollte in diesem Fall helfen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz