PHP wachtwoord vergeten email doet het niet.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Jin vanTongeren

Jin vanTongeren

05/03/2019 19:43:16
Quote Anchor link
Hallo,
Ik ben bezig met een systeem waarbij de gebruiker een "wachtwoord vergeten knop" kan aanklikken.
Als je erop klikt, moet de gebruiker zijn / haar email invoeren waar de gebruiker geregistreerd mee staat.
Als de gebruiker de email invoert, moet het een token id aanmaken in een apart MYSQLI tabel.
Ik heb de hele code gevolgd van een tutorial:

https://youtu.be/wUkKCMEYj9M

Ik weet het, het is niet zelf verzonnen, maar ik weet zelf ook niet hoe ik het zelf zou kunnen maken, dus credits naar MMTUTS.
Bij het verzenden van de mail gaat het fout, maar ik weet niet waarom.
Ik heb mijn eigen webhosting server bij Versio.nl en ik heb zelf eerder al een contact formulier gemaakt, die een email kan verzenden. (Het formulier werkt ook).
Het mysqli gedeelte werkt wel. Dus pwdResetEmail, pwdResetSelector, pwdResetToken, pwdResetExpires worden normaal ingevoerd. Alleen de email wordt dus niet verzonden.

Dus ik weet niet wat ik fout heb gedaan.
Dit is mijn (email verzend) code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    $to
= $userEmail;
    $subject = 'Wachtwoord jinvantongeren.nl herstellen';
    $message = '<p>Er is een verzoek binnengekomen om uw wachtwoord te herstellen. Als u dat niet was, kan u deze e-mail gewoon negeren.</p> <a href="' . $url . '">' . $url . '</a></p>';
    $headers = "From: Jin van Tongeren <no-reply@jinvantongeren.nl> \r \n Reply-To: support@jinvantongeren.nl\r\n Content-type: text/html\r\n";
    mail($to, $subject, $message, $headers);
    header('Location: ../reset-password.php?reset=success&request=valid');
?>


Van het andere contact formulier dat werkte is dit mijn code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
        $name
= $_POST['name'];
        $subject = $_POST['subject'];
        $mailFrom = $_POST['mail'];
        $message = $_POST['message'];
        $mailTo = "support@jinvantongeren.nl";
        $headers = "From: ".$mailFrom;
        $txt = "Je hebt een email van je website namens ". $name.".\n\n".$message;
        mail($mailTo, $subject, $txt, $headers);      
        $mailsend =  'De mail is successvol verzonden!';
    header('Location: ../contact.php?mailSend');
        exit();

?>

Ik heb zelf al geprobeerd een error weer te geven, maar dat gebeurt niet, want er is geen error.
Zelf heb ik ook al in de error log gekeken, maar daar staat ook niets.
Heeft iemand een idee waarom de email niet wordt verzonden?
Alvast bedankt,

Edit:
Topictitel aangepast: vergen => vergeten ;-)
Gewijzigd op 06/03/2019 00:59:34 door - Ariën -
 
PHP hulp

PHP hulp

23/09/2020 21:07:40
 
Thomas van den Heuvel

Thomas van den Heuvel

05/03/2019 19:54:31
Quote Anchor link
Jin vanTongeren op 05/03/2019 19:43:16:

omg heb je die pipo weer...
 
Jin vanTongeren

Jin vanTongeren

05/03/2019 19:56:16
Quote Anchor link
Ja, die pipo.
Maar ik vind dat hij redelijk uitlegt, dus ik kan hem zelf prima begrijpen.
Maar even terug naar mijn vraag:
Hoezo wordt de email niet verzonden?
 
Thomas van den Heuvel

Thomas van den Heuvel

05/03/2019 19:58:00
Quote Anchor link
Al geprobeerd een los e-mailbericht te sturen?
Waaruit blijkt dat het bericht niet wordt verzonden?
Heb je gecontroleerd wat mail() retourneert? Deze geeft namelijk een status terug.

Als PHP zijn werk heeft gedaan is het verder niet meer in handen van PHP. PHP verstuurt namelijk niet zelf de mail.
 
Jin vanTongeren

Jin vanTongeren

05/03/2019 20:05:38
Quote Anchor link
Ik heb nu dit erin gezet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
    if(mail($to, $subject, $message, $headers)) {
        header('Location: ../reset-password.php?reset=success&request=valid');
        exit();
    }

    else {
        header('Location: ../reset-password.php?reset=mailfail');
        exit();        
    }

?>

De email wordt nog steeds niet verzonden.
Maar nu krijg ik geen "?reset=success&request=valid" en ook geen "?reset=mailfail".
In plaats daarvan krijg ik: "?error=invalidrequest"
Die ik zelf nergens heb neergezet.
Dit is mijn volledige code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
if(isset($_POST['reset-request-submit'])) {
    $selector = bin2hex(random_bytes(8));
    $token = random_bytes(32);
    $url = "www.jinvantongeren.nl/create-new-password.php?selector=" . $selector . "&validator=" . bin2hex($token);
    $expires = date("U") + 300;
    require 'connection.inc.php';
    htmlspecialchars($userEmail = $_POST['email']);
    $sql = "DELETE FROM pwdreset WHERE pwdResetEmail=?";
    $stmt = mysqli_stmt_init($conn);
    if(!mysqli_stmt_prepare($stmt, $sql)) {
        echo 'MYSQLI statement mislukt.';
        exit();
    }

    else {
        mysqli_stmt_bind_param($stmt, "s", $userEmail);
        mysqli_stmt_execute($stmt);
    }

    $sql = 'INSERT INTO pwdreset (pwdResetEmail, pwdResetSelector, pwdResetToken, pwdResetExpires) VALUES (?, ?, ? , ?);';  
    $stmt = mysqli_stmt_init($conn);
    if(!mysqli_stmt_prepare($stmt, $sql)) {
        echo 'MYSQLI 2e statement mislukt.';
        exit();
    }

    else {
        $hashedToken = password_hash($token, PASSWORD_DEFAULT);
        mysqli_stmt_bind_param($stmt, "ssss", $userEmail, $selector, $hashedToken, $expires);
        mysqli_stmt_execute($stmt);
    }

    mysqli_stmt_close($stmt);
    mysqli_close($conn);
    
    $to = $userEmail;
    $subject = 'Wachtwoord jinvantongeren.nl herstellen';
    $message = '<p>Er is een verzoek binnengekomen om uw wachtwoord te herstellen. Als u dat niet was, kan u deze e-mail gewoon negeren.</p> <a href="' . $url . '">' . $url . '</a></p>';
    $headers = "From: Jin van Tongeren <no-reply@jinvantongeren.nl> \r \n Reply-To: support@jinvantongeren.nl\r\n Content-type: text/html\r\n";
    if(mail($to, $subject, $message, $headers)) {
        header('Location: ../reset-password.php?reset=success&request=valid');
        exit();
    }

    else {
        header('Location: ../reset-password.php?reset=mailfail');
        exit();        
    }
}

else {
    header('Location: ../reset-password.php?Reset=bad');
    exit();
}

?>


Zoals u ziet, staat "?error=invalidrequest" nergens.
 
- Ariën -
Beheerder

- Ariën -

05/03/2019 20:30:01
Quote Anchor link
Ook niet in een ander deel van de code?

Ikzelf zou wel deze headers gebruiken:
http://wiki.phpbeginners.nl/index.php?title=De_juiste_mailheaders
 
Thomas van den Heuvel

Thomas van den Heuvel

05/03/2019 20:36:14
Quote Anchor link
Je wilt dingen in afzondering testen.

Ga dus eerst na of mailfunctionaliteit in eerste instantie uberhaupt werkt.
 
Jin vanTongeren

Jin vanTongeren

05/03/2019 20:39:37
Quote Anchor link
Ik heb tijdelijk dit even neergezet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
    $to
= $userEmail;
    $subject = 'Wachtwoord jinvantongeren.nl herstellen';
    $message = '<p>Er is een verzoek binnengekomen om uw wachtwoord te herstellen. Als u dat niet was, kan u deze e-mail gewoon negeren.</p>';
    $headers = "From: Jin van Tongeren <support@jinvantongeren.nl> \r \n Reply-To: support@jinvantongeren.nl\r\n Content-type: text/html\r\n";
    if(mail($to, $subject, $message, $headers)) {
        header('Location: ../reset-password.php?reset=success&request=valid');
        exit();
    }

    else {
    echo 'niet gelukt';
}

?>


En ik krijg te zien: "niet gelukt"
Wat doe ik fout?

Toevoeging op 05/03/2019 20:43:19:

Wacht, ik heb in de $to variabel mijn gmail adres gezet. Ik kom nu in mijn header() location terecht. Maar ik krijg geen email in mijn gmail inbox.
 
- Ariën -
Beheerder

- Ariën -

05/03/2019 20:43:44
Quote Anchor link
Of jij wat fout doet weten we niet.
Misschien is er geen mailondersteuning?
Maar gebruik de headers eens waarnaar ik linkte? Misschien controleert de webserver wel strikt op headers.
 
Jin vanTongeren

Jin vanTongeren

05/03/2019 21:00:55
Quote Anchor link
Ik heb nu dit erin gezet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    $to
= 'mijnemailadres@gmail.com';
    $subject = 'Wachtwoord jinvantongeren.nl herstellen';
    $message = '<p>Er is een verzoek binnengekomen om uw wachtwoord te herstellen. Als u dat niet was, kan u deze e-mail gewoon negeren.</p>';
    $headers = 'From: Jin van Tongeren <no-reply@jinvantongeren.nl> \r\n';
    $headers .= 'Reply-To: Jin van Tongeren <support@jinvantongeren.nl>\r\n';
    $headers .= 'Content-type: text/html \r\n';
    if(mail($to, $subject, $message, $headers)) {
        header('Location: ../reset-password.php?reset=success&request=valid');
        exit();
    }

?>


Als ik mijn gmail adres invoer, krijg ik hem niet binnen.
Maar als ik mijn @domein.nl invoer, krijg ik hem wel binnen.
Hoe kan ik door het spam filter van gmail komen?
Gewijzigd op 05/03/2019 21:04:36 door - Ariën -
 
- Ariën -
Beheerder

- Ariën -

05/03/2019 21:05:53
Quote Anchor link
Heb je een SPF en DKIM record in de DNS van je domein staan? Vraag dit anders eens aan je hosting.
Gewijzigd op 05/03/2019 21:06:25 door - Ariën -
 
Jin vanTongeren

Jin vanTongeren

05/03/2019 21:06:36
Quote Anchor link
Ik weet niet wat dat is.
Waar kan ik dat vinden?

Toevoeging op 05/03/2019 21:12:40:

Ik heb nu een vinkje bij mijn hosting aangezet van de DKIM.
Ik weet niet of dit wel / niet goed is.
Zou u me dat kunnen uitleggen?
 
Thomas van den Heuvel

Thomas van den Heuvel

05/03/2019 21:17:40
Quote Anchor link
Het komt nogal nauw met mailheaders.

Er staat een spatie na je no-reply adres.

Daarnaast staat alles tussen enkele quotes.

De carriage return (\r) en line feed (\n) worden dan letterlijk weergegeven als een backslash + de letter r + een backslash + de letter n in plaats van een daadwerkelijke carriage return + linefeed...
 
- Ariën -
Beheerder

- Ariën -

05/03/2019 21:18:01
Quote Anchor link
Mogelijk moet het nu of op korte termijn beter gaan. Gebruik a.u.b. de headers die ik noemde.

Lees ook eens: https://nl.m.wikipedia.org/wiki/DomainKeys_Identified_Mail
Gewijzigd op 05/03/2019 21:27:48 door - Ariën -
 
- SanThe -

- SanThe -

06/03/2019 00:23:51
Quote Anchor link
Wat wil je met dit bereiken?

htmlspecialchars($userEmail = $_POST['email']);

Post van 05/03/2019 20:05:38 regel 8.
 
Thomas van den Heuvel

Thomas van den Heuvel

06/03/2019 00:46:55
Quote Anchor link
Heb even snel (nou ja snel) door die videotutorial gebladerd. De code die die gast schrijft is (nog steeds) bagger.

De video is een bijna anderhalf uur durende typeoefening en dat is echt helemaal nergens voor nodig.

Wat je moet snappen is de flow door die functionaliteit. Als die eenmaal duidelijk is maakt het niet echt uit hoe je dit implementeert, al zou ik het niet doen zoals deze kerel voorstelt.

MMTUTS = troep.
Gewijzigd op 06/03/2019 00:47:09 door Thomas van den Heuvel
 
Jin vanTongeren

Jin vanTongeren

06/03/2019 09:02:55
Quote Anchor link
- SanThe - op 06/03/2019 00:23:51:
Wat wil je met dit bereiken?

htmlspecialchars($userEmail = $_POST['email']);

Post van 05/03/2019 20:05:38 regel 8.


Zodat XSS attacks niet mogelijk worden.
 
- Ariën -
Beheerder

- Ariën -

06/03/2019 09:06:58
Quote Anchor link
Waarom $userEmail = $_POST['email'] ?
Als je nu filter_var() gebruikt om een mailadres te controleren, is het nog fraaier.
Gewijzigd op 06/03/2019 09:11:14 door - Ariën -
 
Jin vanTongeren

Jin vanTongeren

06/03/2019 09:08:20
Quote Anchor link
Omdat de gebruiker een email adres moet opgeven en naar dat email adres wordt het wachtwoord herstel email gestuurd.
 
- Ariën -
Beheerder

- Ariën -

06/03/2019 09:09:18
Quote Anchor link
Maar die constructie...?


Als je nu filter_var() gebruikt om een mailadres te controleren, is het nog fraaier.
 
Jin vanTongeren

Jin vanTongeren

06/03/2019 09:11:04
Quote Anchor link
dus ik moet het volgende doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if(!FILTER_VAR($_POST['email'])
?>
 

Pagina: 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.