Gå til innhold

Har greid å "lage" mail skjema, men....


Anbefalte innlegg

Nå er jeg litt stolt :blush: :!: I går satt jeg en egentlig lang stund og holdt på med et php mail skjema. Jeg lastet det først ned fra en engelsk side, så skrev jeg inn "mitt behov" så etter en stund med det gikk jeg over på å fikse designet :) Utrolig nok fikk jeg det akkuratt som jeg ville og jeg har aldri prøvd meg på php før. Altså jeg har jo ikke laget scriptet selv men jeg er litt stolt uansett :)

 

Nå er det bare det at jeg gjerne skulle hatt med en bildeopplastning i mail skjemaet. Kan noen fortelle meg hvordan jeg går frem for å legge et slikt inn?

 

Her ser dere mailskjemaet.

Lenke til kommentar
Videoannonse
Annonse
Du må legge til koden for at vi skal kunne forklare nermere :) Det er ikke mulig å lese php gjennom kildekoden..

5864936[/snapback]

 

Hei, takk for svar :) Jeg er på skolen nå, dere får koden når jeg kommer hjem ;):)

Lenke til kommentar

<?

// Basic Configurations
$owner_email = "[email protected]";
$subject = "ny melding";
$banned_email = "[email protected],[email protected],[email protected]";
$form_submit_date = date("j - M - Y");
// Messages
$empty_name_error = "Du må skrive inn navnet ditt"; //Error to print when name field is leaved empty
$empty_email_error = "Du må skrive inn email adressen din";  //Error to print when email field is leaved empty
$empty_msg_error = "Du må skrive en melding"; //Error to print when message field is leaved empty
$banned_email_error = "You cannot send email to us as you are banned!";  //Error to print when a banned email address is trying to email you
$form_submitted_message = "Din melding er nå sendt til oss! Vi vil ta kontakt så raskt som mulig."; //Success message after form submission


// Do not edit below here unless you know what you are doing

// Setting Variables
$fe_ = $HTTP_POST_VARS;
$name = $fe_["name"];
$email = $fe_["email"];
$web = $fe_["web"];
$message = $fe_["message"];


// Next lines disallow banned email addressess to send email.
$banned_emails = explode(",", $banned_email);
foreach($banned_emails as $banned) {
if($email == $banned)
{
die("$banned_email_error");
}
}


// Checking if fields are left empty then print error to stop spamming
if (empty($name)){
print "$empty_name_error";
} elseif (empty($email)){
print "$empty_email_error";
} elseif (!eregi("^[_a-z0-9]+(\.[_a-z0-9-]+)*@([a-z0-9-]+\.)+([a-z0-9]{2,4})$",$email)){
print "$empty_email_error";
} elseif (empty($message)){
print "$empty_msg_error";
} else {
$email_contents =
"Name: $name\n
Email: $email\n
Website: $web\n
Message: $message\n
Form submitted on: $form_submit_date\n\n";


// Everything is OK, send email.
$formsend = mail ("$owner_email", "$subject", "$email_contents", "From: $email\r\nReply-to:$email");
print "$form_submitted_message";
}

?>

 

Denne koden? :)

Lenke til kommentar
Noen som har et godt bilde opplastings script? Kan dere også vise meg hvor jeg skal plassere det i mitt script?  :)

5866563[/snapback]

 

Hvis ingen har noe ferdig skal jeg se på det i kveld/natt

5867175[/snapback]

 

Tusen takk :):thumbs::thumbup::wee:

Lenke til kommentar
Noen som har et godt bilde opplastings script? Kan dere også vise meg hvor jeg skal plassere det i mitt script?  :)

5866563[/snapback]

 

Hvis ingen har noe ferdig skal jeg se på det i kveld/natt

5867175[/snapback]

 

Tusen takk :):thumbs::thumbup::wee:

5867602[/snapback]

 

Det du egentlig ber om er et skjema som sender vedlegg av ymse slag.

Jeg har laget et lite script, men siden jeg ikke har greie på hacking aner jeg ingenting om sikkerhet osv i dette.

Men anyway:

Du må først endre på skjema ditt, i formtag til enctype="file/multipart".

Deretter må du legge inn en input type file med name "ett eller annet".

 

I php-koden legger du inn variabler for super global array $_FILES, hvor informasjon om filen som er lastet opp finnes. Denne leses i binary mode, og legges ved eposten. Deretter opprettes mime boundary, som er en måte for epostprogrammet å vite når tekst begynner og når annet innhold begynner... type ting.

 

Så sender du epost, og vips! du har vedlegg.

Scriptet sjekker for tom epost, navn, emne og tekstfelt, men sjekker ikke om epost er gyldig.

Scriptet sjekker for lovlig filtype og lovlig filstørrelse.

<?php
if(isset($_REQUEST['submit'])){
   /*
   * Fetching form data
   */
      $fileatt = addslashes(strip_tags($_FILES['file']['tmp_name']));
   // Filetype of attachment file
      $type = $_FILES['file']['type'];
   // Filename of attachment file
      $fileatt_name = $_FILES['file']['name'];
   // file size of attachmennt file
      $size = $_FILES['file']['size'];
   // file attachment type               
   $fileatt_type = "application/octet-stream";
   // Sender's name
   $sender = empty($_REQUEST['name']) ? "" : strip_tags($_REQUEST['name']);
   // Sender email
   $email_from = empty($_REQUEST['email'])? "" : strip_tags($_REQUEST['email']);
   // Email subject
   $email_subject = empty($_REQUEST['subject']) ? "" : strip_tags($_REQUEST['subject']);
   // Message body
   $email_txt = empty($_REQUEST['msg'])? "" : htmlentities($_REQUEST['msg']);
   // Email receiver
   $email_to = "[email protected]";
   $back_link = "<a href=\"javascript:history.back();\">Fix It</a>";
   
   if(empty($sender) || empty($email_from) || empty($email_subject) || empty($email_txt)){
       die("Please fill out the form completely<br />\n$back_link");
   }
   
   // File types allowed to send as attachment
   $allowed_files = array('image/jpg', 'image/jpeg', 'image/gif', 'image/GIF', 'image/JPG', 'image/JPEG', 'image/png');
   // Check if attachment filetype is legal
   if(in_array($type, $allowed_files)){
       /*
       * Limit of file size. Don't want enormous files
       * or small files containing nothing
       */
       $limit = 200000; // 200 kb
       // Everything is okay with the attachment file, read it!
       if($size < $limit && $size > 0){    
           // Opens the file attachment for reading in binary mode
           $file = fopen($fileatt,'rb');
           $data = fread($file,filesize($fileatt));
           fclose($file);

           $semi_rand = md5(time());
           // Mime boundary is prepared
           $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
              /*
           * the primary content-type header (the first one) is multipart/mixed.
           * This tells the client e-mail reader that there are multiple segments
           * to this e-mail, and each has its own specific content-type.
           * the value specified by the boundary parameter in the primary content-type
           * header is used to separate each "chunk" of the e-mail (called a MIME boundary marker).
           */
           $headers = "From: $email_from;r\nMIME-Version: 1.0\r\n" .
                       "Content-Type: multipart/mixed;\r\n" .
                       " boundary=\"{$mime_boundary}\"";

           $email_message = "This is a multi-part message in MIME format.\n\n" .
               "--{$mime_boundary}\n" .
               "Content-Type:text/html; charset=\"iso-8859-1\"\n" .
                  "Content-Transfer-Encoding: 7bit\n\n" .
               $email_txt . "\n\n";

           $data = chunk_split(base64_encode($data));
           $email_message .= "-----{$mime_boundary}----\n" .
                 "Content-Type: {$fileatt_type};\n" .
                 " name=\"{$fileatt_name}\"\n" .
                 "Content-Disposition: attachment;\n" .
                 " filename=\"{$fileatt_name}\"\n" .
                 "Content-Transfer-Encoding: base64\n\n" .
                    $data . "\n\n" .
                 "-----{$mime_boundary}-----\n";
           /*
           * Everything is okay - let's try to send an email with attachment
           */
           $ok = @mail($email_to, $email_subject, $email_message, $headers);
           // Message on success
           if($ok) {
               echo "<font face=verdana size=2>The file was successfully sent!</font>";
           // Error message on failure
           } else {
               die("Sorry but the email could not be sent. Please go back and try again!");
           }
       }else{
           // File size was either above 200kb or 0kb
           echo("Wrong file size of attached file");
           exit;
       }
   }else{
       // File type was not jpg, gif or png
       echo("Illegal file type");
       exit;
   }
}else{
// The page is requested for the first time, display html form
echo <<<HTML
<form method="post" action="" enctype="multipart/form-data">
   <table width="30%">
       <tr>
           <td>Name:</td><td><input type="text" name="name"></td>
       </tr>
       <tr>
           <td>Email:</td><td><input type="text" name="email"> </td>
       </tr>
       <tr>
           <td>Subject:</td><td><input type="text" name="subject"></td>
       </tr>
       <tr>
           <td colspan="2">Attachment:</td>
       </tr>
       <tr>
           <td colspan="2"><input type="file" name="file"></td>
       </tr>
       <tr>
           <td colspan="2">Message: </td>
       </tr>
       <tr>
           <td colspan="2">
               <textarea name="msg" cols="30" rows="15"></textarea><br />
           </td>
       </tr>
       <tr>
           <td> </td><td><input type="submit" name="submit" value="Send epost med vedlegg"></td>
       </tr>
   </table>
</form>
}
?> 

 

Lettere lesbar kildekode kan sees her:

Kildefiler på Nibbler.no

Endret av CruellaDeVille
Lenke til kommentar
Hm.... Forstod ikke så mye av det jeg :blush: Ja jeg vet at jeg er tåpelig, men jeg har nettopp begynt å "snuse" litt på dette med php, og egentlig så kan jeg ingenting :blush:

5869103[/snapback]

 

Okay.. La oss gå igjennom det steg for steg:

Skriptet starter med if(isset($_REQUEST['submit'])){ . Hvis du ser i skjemaet heter knappen for å sende epost "submit". Denne kan hete fiskeboller også, men det er greitt å ha et logisk navn og viktig - samme navn både i i skjema og variabelen. REQUEST forteller at vi enten skal hente verdier fra post (fra et skjema) eller get (fra et skjema eller en url). NÅr jeg skriver REQUEST trenger jeg ikke bry meg om metoden for overføring av data er post eller get.

 

Videre:

 

/*
   * Fetching form data
   */
      $fileatt = addslashes(strip_tags($_FILES['file']['tmp_name']));
   // Filetype of attachment file
      $type = $_FILES['file']['type'];
   // Filename of attachment file
      $fileatt_name = $_FILES['file']['name'];
   // file size of attachmennt file
      $size = $_FILES['file']['size'];
   // file attachment type               
   $fileatt_type = "application/octet-stream";
   // Sender's name
   $sender = empty($_REQUEST['name']) ? "" : strip_tags($_REQUEST['name']);
   // Sender email
   $email_from = empty($_REQUEST['email'])? "" : strip_tags($_REQUEST['email']);
   // Email subject
   $email_subject = empty($_REQUEST['subject']) ? "" : strip_tags($_REQUEST['subject']);
   // Message body
   $email_txt = empty($_REQUEST['msg'])? "" : htmlentities($_REQUEST['msg']);
   // Email receiver
   $email_to = "[email protected]"; 

Her hentes variabler ut fra post/get-felt i et skjema.

strip_tags fjerner html-koder som eventuelt er postet med, addslashes legger til \ foran " og '. Dette er viktig, siden php-parser ("programmet" som oversetter kode til html og utfører kommandoer i skriptet) bruker " og ' sammen med variabler. La oss si at du har en variabel, $name med verdi "O'reilly". Og så sier du at $name = 'O'Reilley';. Spørsmålet blir da: hvordan kan php-parser vite når variabelen navn begynner og slutter? Et annet issue i forhold til addslashes er når det gjelder cross site scripting og sql injection, det sistnevnte gjør at en ondsinnet bruker kan få tak i informasjon i din database. Dette er ikke så relevant i forhold til epost da.

 

All informasjon om filen ligger i en global superarray (kan sees på som en tabell), som heter $_FILES. I denne todimensjonale arrayen ligger informasjon om filtype, filstørrelse, filnavn og sikkert mer. Her har jeg et inputfelt i skjema mitt av typen file

<input type="file" name="file">

. Samme som med "submit" isted - samme navn begge steder.

 

Syntaks for $email_from er en trinær operator.

$email = empty($_POST['email']) ? "" : strip_tags(addslashes($_POST['emai']));

 

Denne sier at hvis feltet email i skjema er tomt er $email lik tom streng (""), hvis ikke er den lik verdien i feltet epost. På samme måte undersøker jeg de andre skjemafeltene.

 

Jeg innbilder meg at siden $_FILES['file']['size'] hentes ut automatisk fra filen og ikke fra en bruker trenger en ikke sjekke disse. Somebody shoot me if I'm wrong.

 

I $_FILES['file']['type'] ligger informasjon om filtypen til filen du forsøker å laste opp. Siden vi vet at du skal ha bilder av kjæledyr ønsker du kun bildefiler. Derfor lager vi en tabell (array) over godkjente filtyper:

// File types allowed to send as attachment
   $allowed_files = array('image/jpg', 'image/jpeg', 'image/gif', 'image/GIF', 'image/JPG', 'image/JPEG', 'image/png'); 

Denne sier at kun jpg, gif og png-bilder er godkjente filer, alt annet blir refusert.

 

Videre sier du at du ikke ønsker store (eller mini_mini) filer, og sammenligner $_FILES['file']['size'] mot verdien i $limit. Denne er 200 000 (bytes), som er det samme som 200kb. Jeg laget en gang et filopplastningsskript, og av en eller annen grunn forsøker noen folk å sende filer på 0 byte. Disse skal vi også fange opp.

if($size < $limit && $size > 0){     
//
}

 

Nå er innhold i skjemaet sjekket, filtypen og filstørrelsen er sjekket... Nå er det i grunnen bare å lese filen og legge den til i eposten.

$file = fopen($fileatt,'rb');
           $data = fread($file,filesize($fileatt));
           fclose($file); 

 

Her leses filen som en binærfil (i motsetning til en tekstfil).

fopen() åpner en filstrøm og tar to parameter, et filnavn og et "mode", som er tillatte operasjoner på filen. I dette tilfellet skal vi bare lese.

Variabelen $data inneholder innholdet i filen, her binærdata. Til sist lukkes strømmen med fclose()

 

Siden dette ikke er en epost i ren teks må epostprogramme (parser, gudene må vite hvem) vite når det er tekst og når det er annet innhold. Dette gjøres i multipart_boundary. Her fortelles det hvilken type innhold det er i eposten, hvilken encoding type det er osv etc mm.

 

Til sist forsøker vi å sende eposten ved hjelp av php-funksjonen mail()

Hvis eposten blir sendt skrives ut en passende melding, hvis ikke skrives det ut en feilmelding.

 

Alt dette skjer hvis en bruker har trykket på "send epost med vedlegg"-knappen i skjemet. Hvis knappen ikke er trykket kan man trygt anta at brukeren ankommer siden for første gang, og trenger et html-skjema for å sende epost.

 

Så derfor skriver vi ut dette.

 

Dette er neppe forklart på en slik måte at en helt nybegynner til php kan forstå, men kan du litt skal ikke dette være helt gresk.

 

 

mvh

Lenke til kommentar
Må man foressten ha et eget program for å lage "php mapper" på dataen? Det nytter jo ikke å legge kodene i en tekst mappe. :hm:

5869172[/snapback]

 

Hva mener du med php-mapper? Og hva er en tekst-mappe? Du har en host, right? (dyresiden din, minnes jeg). Du legger php-scriptet under samme mappe som du legger et hvilket som helst html-dokument og lenker til det på vanlig måte, bare at filen heter *.php og ikke *.html.

Lenke til kommentar
Må man foressten ha et eget program for å lage "php mapper" på dataen? Det nytter jo ikke å legge kodene i en tekst mappe. :hm:

5869172[/snapback]

 

Hva mener du med php-mapper? Og hva er en tekst-mappe? Du har en host, right? (dyresiden din, minnes jeg). Du legger php-scriptet under samme mappe som du legger et hvilket som helst html-dokument og lenker til det på vanlig måte, bare at filen heter *.php og ikke *.html.

5869423[/snapback]

 

Jeg har en gratishost.. Siden min er egentlig ikke offesiellt åpnet enda. Jeg skal snart kjøpe webhotell uansett.

 

Tusen takk for hjelp. Jeg må se på det du har forklart meg nå, i morgen for nå er jeg for trøtt til å sitte å konsentrere meg.

Lenke til kommentar
Må man foressten ha et eget program for å lage "php mapper" på dataen? Det nytter jo ikke å legge kodene i en tekst mappe. :hm:

5869172[/snapback]

 

ta en titt på denne funksjonen mkdir()

 

den er for å lage en "directory/mappe" på en server ved hjelp av php. aldri hørt om tekst mapper eller php mapper før, men denne lager en "helt vanlig" mappe/directory/folder

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...