14. februar 2007 - 06:02Der er
64 kommentarer og 3 løsninger
Hvad gør jeg forkert i denne php kode?
Hej E
Jeg har 2 php filer ved navn mail.php og send_mail.php
Koden til mail.php er: <html> <head><title>PHP Mail Sender</title></head> <body> <?php /* All form fields are automatically passed to the PHP script through the array $HTTP_POST_VARS. */
/* PHP form validation: the script checks that the Email field contains a valid email address and the Subject field isn't empty. preg_match performs a regular expression match. It's a very powerful PHP function to validate form fields and other strings - see PHP manual for details. */
if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $email)) {
Det jeg gerne vil have den til, er at afsender skal være navnet på vedkommende som udfylder dette formular og deres emailadresse ligeså som afsender.
Nu er denne kode hentet fra nette og jeg har desværre ikke den store erfaring med php endnu (eller rettere, stadig ikke) og har derfor prøvet at roder rundt med de enkelte _sendermail/sender_mane osv uden held.
ferrari_brian -> 14/02-2007 08:17:31 Det skal ikke rettes til: email, det står som sender_mail Men du har ret i ferrari_brian -> 14/02-2007 08:20:49 Dog bør det ikke have den store betydning.
men hvis jeg ikke har ret i det med at $email skal være den email der bliver posted og ikke 'sender_mail', så vil man jo få både afsender og modtager med den samme mail, pga afsender er 'sender_mail'.
Så vidt jeg kunne forstå skulle det være en mail fra listen der skulle være modtager, men det bliver det ikke hvis den er konfigureret til 'sender_mail', idet listen sender med navnet 'email'
/* PHP form validation: the script checks that the Email field contains a valid email address and the Subject field isn't empty. preg_match performs a regular expression match. It's a very powerful PHP function to validate form fields and other strings - see PHP manual for details. */
if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $email)) {
derfor kunne man evt tjekke på om de adresser der sendes til ikke bare er valide adresser, men også er lig en af de foruddefinerede modtagere. Jeg plejer at hardcode modtageren, således der kun er en, men hvis man vil have flere, så er man nødt til at tjekke på det.
udover det så kan du ikke rigtig hardcode afsender, hvis det er en slags kontakt-form?
Tusind tak for jeres svar, men de virker alle sammen uoverskuelige for mig. Faktisk er jeg blevet mere usikker end jeg var før.
En ting er at jeg ændrer alle $HTTP_POST_VARS til $_POST[], men resten er volapyk for mig.
For at jeg kan forstå koden i mit lille hoved, så skal jeg kunne sammenligne - ved at sammenligne forstår jeg brugen af en kode - håber i fatter hvad jeg mener ;-)
Så hvordan burde en rigtig kode se ud??????? Er dette rigtigt?
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> <html> <head><title>PHP Mail Sender</title></head> <body> <?php /* All form fields are automatically passed to the PHP script through the array $_POST. */ $header = "From: " . $_POST['sender_name'] . " <" . $_POST['sender_mail'] . ">\n"; $header = "Reply-To: " . $_POST['sender_name'] . " <" . $_POST['sender_mail'] . ">\n"; $email = $_POST['email']; $sender_name = $_POST['sender_name']; $subject = $_POST['subject']; $message = $_POST['message'];
if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $email)) {
Det som ikke virker nu, og som jeg meget gerne vil have den til, er at få afsenders NAVN/MAILADR: til at stå som afsender og ikke dette som den skriver pt., nemlig webxxxxxx.mit_domæne.dk@webxx.talkactive.net
Så skal du lave noget kode der helt simpelt sender en email med den afsender og modtager som du ønsker. Du skal kigge på dette eksempel: Eksempel 2. Afsende mail med brugerdefineret brevhoved.
Det er der ikke tid til. Jeg spørger efter svar til et emne og det må du gerne hjælpe mig med, ud fra de ting jeg skriver. At give mig et link til en manual som jeg skal bruge ½ år bare på at lære at forstå, kommer jeg ingen vejne med. Som tidligere forklaret, så fatter jeg kun koden ved at se tingene VED SIDEN af hinanden. Olebole har prøvet i fem år at forklare mig hvordan php hænger sammen uden hjælp.
Så venligst - vær kontret og hjælp mig eller undlad ... please.
Og det skal IKKE lyde utaknemmelig - jeg har nu i to uger prøvet at få en skide form2mail med php til at virke og jeg spørger bare et simpelt spm. - derfor hjælp mig istedet for at sende mig videre. For jeg har jo igen og igen forklaret at min hjerne ikke kan læse sig frem til en løsning, men jeg skal se eksemblerne for at forstå.
Jakobdo >> Nej, du misforstår - for jeg er nemlig IKKE sur. Prøver bare at forstå din #%&¤#& koder og det irriterer mig at jeg ikke fatter noget uda fra en forklarende tekst. Men sættes den rigtige og forkerte kode op mod hinanden, så vil hjerne gerne følge med! (hvis man ellers har sådan én)
Men hvis du kan forklare hvor et \r har så stor betydning, så ville det jo være skønt ;-)
Men hvorfor skal de manualer også være så besværlige - hvorfor findes der ikke et setd som forklare os dødelige hvordan man starter med noget konkret og ikke mindst, forklarer hvorfor lige netop $_post bruges og i hvilken sammenhæng.
F.eks i html: Ønsker du at få en fed/fremhævet tekst, så brug <b>din tekst</b> hvor B står for bold og koden starter med en < og slutter med en >. Koden ophører ved brug af en / i sammen kode som man startede med. Se, det er jo pædagoisk og til at fatte. Sådan noget leder jeg efter til php.
Og dette var/er ikke en kritik af alle jer dygtige eksperter! ;-)
Navn, adresse og data. Snakker vi navn og email eller adresse som: paradis æblevej 2? For så skal du tilføje ekstra felter i din formular. og så kan du tilføje dem i $message via:
Altså i stedet for: $message = $_POST['message']; laver du så:
Denne kode skal placeres mellem <head> og </head> og den gør det at den redirecter til index.html indenfor 5 sekunder... (det er det 5-tallet gør i koden)
/* PHP form validation: the script checks that the Email field contains a valid email address and the Subject field isn't empty. preg_match performs a regular expression match. It's a very powerful PHP function to validate form fields and other strings - see PHP manual for details. */
if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $email)) {
Jakobdo >> Se, nu føler jeg du gider at hjælpe ved at forklare - og oprigtigt - så er det skønt. Så giver du en lyst til at dyrke koden og det hjælper mig utrolig meget at forstå. Det skal du have tak for.
ja, gættede nok at en location: vil skabe røre i koden. Men er det korrekt opfattet, at jeg "bare" skulle have lavet en exit();, altså bede koden om at afslutte og gå ud efter header location?
Tillægspm: I koden: elseif (mail($email,$subject,$message)) { skulle den ikke se således ud: elseif (mail($sender_name,$sender_mail,$email,$subject,$message)) {
og hvorfor behøves sender_name/mail ikke komme med i denne streng?
Ferrari_Brian>> Nej, vil helst ikke bruge meta tag'en - da det efter min opfattelse vil forwarde hel siden når den kaldes uanset om du skriver eller ej. Men måske har jeg opfattet dit svar eller den form for kodning forkert.
Umiddelbart var det også min ide, men så tænkte jeg at siden bliver jo forwarden når dden loades og derfor kan den ikke bruges.
Desuden - mere vigtigt for mig. Nemlig ikke at blande lange koder ind i hinanden, men holde dem korte og linket til hinanden.
Og vha. header:loacation funktion (når jeg har lært brugen af den) så kan jeg få åbnet et helt nyt nindue med ny kode osv osv.
futurefreak >> det er korrekt mht meta-tag at den forwarder siden når du kommer ind på den... derfor du kan bruge location ja. Men metatags kan (selvom det ikke er god kodestil) også ligges i en if sætning og på den måde kun bruges når den opfylder dine krav.
og lige for at hjælpe:
$message er en variabel
.= betyder at den tager den variabel der står til venstre for bliver tillagt det som der står til højre for, dvs:
$variabel = "test"; $variabel .= " det virker";
vil give at variabelen først bliver tillagt strengen "test", og dernæst bliver tillagt strengen " det virker"... hvis det så udskrives ville det give:
echo $variabel;
giver:
test det virker
dvs når der er et ligmed tegn tildeler (eller overskriver) man variablen med en værdi og når man bruger punktum-ligmed lægger man en værdi til den eksisterende værdi.
futurefreak: At data lige skal stå der, vidste jeg ikke, men jeg skrev det bare, for at skrive det et sted. Du har ikke udtrykt hvor du ville have det, så tog en chance.
For at undgå spam, skal du overvej en teknologi som hedder captcha. Og nu kommer der nok brok over jeg ikke laver fungerende kode til dig, men jeg har ikke tiden lige nu.
/* PHP form validation: the script checks that the Email field contains a valid email address and the Subject field isn't empty. preg_match performs a regular expression match. It's a very powerful PHP function to validate form fields and other strings - see PHP manual for details. */
if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $email)) {
Det er hermed skrevet og afprøvet så det fylder op til dine krav. Der er ikke lavet nogen anti-spam-funktion. Men alt andet virker. Den redirecter til index.php når mailen er afsendt korrekt, ellers giver den en fejlbesked.
Jeg fandt samtidig en fejl i tjek-rutinen, fordi den testede på email og ikke sender_mail. Dette er en fejl da email kommer fra select-boxen. men der bliver nu testet på begge, idet der kommer en fejl hvis man ikke vælger en email i listen, dette kommer ved at mail()-funktionen selv tjekker at mailen er korrekt.
/* PHP form validation: the script checks that the Email field contains a valid email address and the Subject field isn't empty. preg_match performs a regular expression match. It's a very powerful PHP function to validate form fields and other strings - see PHP manual for details. */ if (!preg_match("/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/", $sender_mail)) { echo "<h4>Invalid email address</h4>"; echo "<a href='java script:history.back(1);'>Back</a>"; } elseif ($subject == "") { echo "<h4>No subject</h4>"; echo "<a href='java script:history.back(1);'>Back</a>"; } elseif (mail($email,$subject,$message,$header)) { header ('Location: index.php'); } else { echo "<h4>Can't send email to $email</h4>"; echo "<a href='java script:history.back(1);'>Back</a>"; } /* Sends the mail and outputs the "Thank you" string if the mail is successfully sent, or the error string otherwise. */ ?>
Og det som i forslår med: elseif (mail($email,$subject,$message,$header)) { <meta http-equiv="refresh" content="url=index.html"> } else { // Den reloader efter 5 sek. <meta http-equiv="refresh" content="5;url=index.html"> echo "<h4>Can't send email to $email</h4>"; }?>
vil så se således ud (og som ikke virker): >>>>>>>>>>>koden starter>>>>>>>>>>>>>>> <?php
Og det som i forslår med: elseif (mail($email,$subject,$message,$header)) { <meta http-equiv="refresh" content="url=index.html"> } else { // Den reloader efter 5 sek. <meta http-equiv="refresh" content="5;url=index.html"> echo "<h4>Can't send email to $email</h4>"; }?>
vil så se således ud (og som ikke virker): >>>>>>>>>>>koden starter>>>>>>>>>>>>>>> <?php
Håber på min kone får en bedre fødsels end dette her *griner* - det var en hård nød at knække, men jeg lærte meget og i alle skal have tusind tak for at give mig mod til at dyrke php koden lidt mere.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.