Hallo iedereen!

Zoals de titel een beetje aantoont maak ik een reservatie systeem in HTML/PHP.
Er wordt een HTML form ingevuld en die waarden worden doorgegeven naar de eerste .php file (reservation-send.php).
Die .php file maakt een emailbericht waarin enkele waarden van de form inkomen en de url link om te bevestigen (incl. hash code).
De mail en link wordt verstuurd naar iemand van het restaurant om te bevestigen (klikken op de url link).
Wanneer die link wordt geklikt, wordt er een 2de .php file aangesproken (bevestiging.php).
Die file controleert of de hash code en email correct zijn, indien dit zo is wordt er opnieuw een mail verzonden naar degene die de reservatie maakte met de bevestiging van de reservatie.

Output URL

Volgens mij loopt het mis door een fout in het aanmaken van de url link.
Ik krijg steeds "fout!" als er wordt op geklikt.
Zie output link voor de output van de mail.

Alvast bedankt!

Voor verdere vragen shoot maar eh!

reservation-send.php

<?php 
require_once 'inc/securimage/securimage.php'; 

///////////////////////////////////// 
// Change this email address //////// 
$email = "[email protected]"; //dit express zo gemaakt voor deze post 

///////////////////////////////////// 

$required = array('day', 'month', 'year', 'hour', 'minutes', 'ampm', 'name', 'email', 'captcha', 'phone', 'amount'); 
$response = array('status' => 'failed', 'errors'=>array()); 

if(isset($_POST['reservation'])) { 
    foreach($_POST['reservation'] as $field => $value) { 
        //check required field if empty 
        if($value == '' && in_array($field, $required)) { 
            $response['errors'][$field] = $field; 
        } 
    } 

    //validate email 
    if(!isset($response['errors']['email'])) { 
        if(!filter_var($_POST['reservation']['email'], FILTER_VALIDATE_EMAIL)) { 
            $response['errors']['email'] = 'email'; 
        } 
    } 

    //validate captcha 
    if(!isset($response['errors']['captcha'])) { 
        $securimage = new Securimage(); 
        if ($securimage->check($_POST['reservation']['captcha']) == false) { 
            $response['errors']['captcha'] = 'captcha'; 
        } 
    } 

} 

if(empty($response['errors'])) { 
    $response['status'] = 'success'; 

    $data = $_POST['reservation']; 

    //Generate email link 

        //save mail of who made the reservation - get from form 
        $email_reservering =$data['email']; 

        //generate hash code 
        $hash = md5($email_reservering); 

        //generate link with hash code 
        $link = "http://mijndomein.be/bevestiging.php?email=”.urlencode($email_reservering).”&hash=$hash"; 

    $headers = ""; 
    $message .= "Dag Lode en Eva, via de website kregen jullie een nieuwe reservatie, gelieve de persoon zo snel mogelijk een bevestigingsmail te sturen!"; 
    $message .= "\n\n"; 
    $message = $data['message']; 
    $message .= "\n\n"; 

    $message .= " Telefoon: " . $data['phone']; 
    $message .= "\n\n"; 
    $message .= " Lunch/Diner: " . $data['booking-type']; 
    $message .= "\n\n"; 
    $message .= " Aantal personen: " . $data['amount']; 
    $message .= "\n\n"; 
    $message .= " Email: " . $data['email']; 

    $message .= "\n\n"; 
    $message .= " Datum: " . $data['day']; 
    $message .= "\n\n"; 
    $message .= " Maand: " . $data['month']; 
    $message .= " " . $data['year']; 
    $message .= "\n\n"; 
    $message .= " Tijdstip: " . $data['hour'] . " " . $data['minutes'] . " " . $data['ampm']; 
    $message .= "\n\n\n\n"; 
    $message .= "<a href='".$link."'>Bevestig</a>"; 

    $subject = 'Nieuwe reservatie via de website'; 
    $headers = 'From: '. $data['email']. "\r\n" .'Reply-To: '. $data['email']. "\r\n" .'X-Mailer: PHP/' . phpversion(); 

    if (mail($email, $subject, $message, $headers)) { 

    } else { 
        $response['status'] = 'failed'; 
    } 
} 

echo json_encode($response);
?>


------------------------------------------------------------------

Bevestiging.php

<?php 

//retrieve email and hash code from link 
$email_reservering = urldecode($_GET['email_reservering']); 
$hash = $_GET['hash']; 

//check if hash code matches 

if (md5($email_reservering) == $hash) 
{ 
    //succes     
    $headers = ""; 
    $message .= "reservering bevestigd!"; 
    $message .= "\n\n"; 

    $subject = 'Bevestiging reservering'; 

    if (mail($email, $subject, $message, $headers)) { 

    } else { 
        $response['status'] = 'failed'; 
    } 
} 
else 
{ 
    //error 
    echo "error!"; 
} 

?>

@Aar, @randy flujowa, @obelix en idefix

Trust me heb heel veel research gedaan en idd mercury geprobeerd.
php.ini & sendmail.ini aangepast voor gmail smtp te gebruiken.
Kreeg het niet werkende.

@Thomas van den Heuvel

zo dan?

$link = "http://lanes.be/baronie/bevestiging.php?email=.urlencode($email_reservering).&hash=$hash";

en

$email_reservering = urldecode(['email_reservering']);
Uitgaande van je oorspronkelijke code hoef je enkel in reservation-send.php regel 52 te vervangen door:
$link = 'http://mijndomein.be/bevestiging.php?email='.urlencode($email_reservering).'&hash='.$hash;
(met het juiste domein, uiteraard...)

Oftewel, fix je dubbele quotes. Tevens kan het voor de leesbaarheid handig zijn om variabelen buiten quotes te halen.

Daarnaast is het verstandig om in Bevestiging.php regel 4 te vervangen door:
$email_reservering = $_GET['email_reservering'];

Ten einde de kans op dubbele de-coding weg te nemen.

EDIT: Dat moet trouwens waarschijnlijk $_GET['email'] zijn, niet $_GET['email_bevestiging'].

EDIT: En vervolgens stuur je een mail naar $email... wtf. Dat klopt ook niet he.
Krijg dat te zien maar nog steeds "fout!" als ik de link copy/paste want klikken gaat niet.



je bedoelt waarschijnlijk $email_reservering = $_GET['email_reservering']; vervangen naar $email_reservering = $_GET['email']; ipv $email_reservering = $_GET['email_bevestiging']; ?

En dit vervangen if (mail($email_reservering, $subject, $message, $headers)) {

naar:
if (mail($email_reservering, $subject, $message, $headers)) {

Lees bovenstaande toevoegingen, er klopt geen biet van Bevestiging.php

De md5 hash van [email protected] is 553abde2308030392b77849376f998a8, dus dat klopt iig.

Rest je nog cleanup in Bevestiging.php.
We zijn al een grote stap verder!
Ik krijg nu de bevestiging van de mail maar moet daarvoor wel in mail functie, het adres zetten van degene die de eerste mail ontvangt.
Ik zou de email moeten kunnen ophalen in bevestiging.php die in de form wordt ingevuld want daar moet ook de mail naartoe.

Dus hoe het moet zijn:

Form -> send-reservation.php (verstuurd mail naar restaurant) -> restaurant ontvangt mail en klikt op link om te bevestigen -> die dat de form invulde (daarin ook zijn email) moet nu de bevestiging mail krijgen met boodschap: "reservering bevestigd!";

Hoe het nu is:

Form -> send-reservation.php (verstuurd mail naar restaurant) -> restaurant ontvangt mail en klikt op link om te bevestigen -> restaurant ontvangt mail met boodschap: "reservering bevestigd!";

door deze lijn:

if (mail($email_reservering, $subject, $message, $headers)) {

bovenstaande zou iets moeten zijn van:

[b]if (mail($email, $subject, $message, $headers)) {


Naast het verzenden van informatie via e-mail zou ik ook het een en ander vastleggen in een database omdat e-mail niet echt een stabiel medium is. Denk aan: spamfilters, vertraging in verzending en ontvangst et cetera. Er is, net zoals met papieren post, geen enkele garantie dat een verzonden bericht ook aankomt. Daarom lijkt het mij belangrijk dat je ook op een andere manier (database) informatie bewaart. Daar kun je dan later ook weer informatie uithalen, bijvoorbeeld het oorspronkelijke e-mailadres van de persoon die reserveert op grond van een reserveringsnummer of iets dergelijks. Anders zul je al die informatie via een of meer URLs moeten doorgeven...
I know maar die database heb ik al ervaringen mee, deze mailings niet.
Dus heb ik gekozen om eerst tijd te steken in dat eerste voor ik database begin.
Dus je zegt dat ik ook dat email in de link moet verwerken?
Euh, tenzij je ergens die informatie opslaat of telkens doorgeeft ben je deze toch kwijt?

De check met de hash, als dit een poging is om de reservering moeilijker te vervalsen ofzo, is trouwens nogal zwak (je hebt zo uitgevogeld dat de hash gelijk is aan de md5-waarde van het e-mailadres).

Ook hier kan een database uitkomst bieden: koppel een random gegenereerde hash aan een reserverings-id. Deze combinatie is haast onmogelijk te raden.

Ofwel dat, of introduceer een "geheim woord" wat je meeneemt in de hash.
als ik het werkende kreeg.. ging ik salt implementeren.

btw het werkt nu hoe het moet werken! Waarvoor zeer grote dank!
Zonder jou had dit waarschijnlijk langer geduurd om te achterhalen dat die quotes verkeerd waren en de encodeurl niet nodig was.

Enkel werkt dit nog niet:



Ik krijg dit zo nog altijd in de mail..
Enige idee hoe ik dit als een klikbare link krijg met als tekst enkel "Bevestig"
HTML-headers toevoegen:

$header.= 'MIME-Version: 1.0' . "\r\n";
$header.= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

Reageren