PHP wachtwoord vergeten email doet het niet.
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)
1
2
3
4
5
6
7
8
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 <[email protected]> \r \n Reply-To: [email protected]\r\n Content-type: text/html\r\n";
mail($to, $subject, $message, $headers);
header('Location: ../reset-password.php?reset=success&request=valid');
?>
$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 <[email protected]> \r \n Reply-To: [email protected]\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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 = "[email protected]";
$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();
?>
$name = $_POST['name'];
$subject = $_POST['subject'];
$mailFrom = $_POST['mail'];
$message = $_POST['message'];
$mailTo = "[email protected]";
$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 -
Jin vanTongeren op 05/03/2019 19:43:16:
omg heb je die pipo weer...
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?
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.
Code (php)
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)
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
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 <[email protected]> \r \n Reply-To: [email protected]\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();
}
?>
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 <[email protected]> \r \n Reply-To: [email protected]\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.
Ikzelf zou wel deze headers gebruiken:
http://wiki.phpbeginners.nl/index.php?title=De_juiste_mailheaders
Ga dus eerst na of mailfunctionaliteit in eerste instantie uberhaupt werkt.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
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 <[email protected]> \r \n Reply-To: [email protected]\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';
}
?>
$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 <[email protected]> \r \n Reply-To: [email protected]\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.
Misschien is er geen mailondersteuning?
Maar gebruik de headers eens waarnaar ik linkte? Misschien controleert de webserver wel strikt op headers.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
$to = '[email protected]';
$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 <[email protected]> \r\n';
$headers .= 'Reply-To: Jin van Tongeren <[email protected]>\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();
}
?>
$to = '[email protected]';
$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 <[email protected]> \r\n';
$headers .= 'Reply-To: Jin van Tongeren <[email protected]>\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 -
Gewijzigd op 05/03/2019 21:06:25 door - Ariën -
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?
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...
Lees ook eens: https://nl.m.wikipedia.org/wiki/DomainKeys_Identified_Mail
Gewijzigd op 05/03/2019 21:27:48 door - Ariën -
htmlspecialchars($userEmail = $_POST['email']);
Post van 05/03/2019 20:05:38 regel 8.
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
- 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.
htmlspecialchars($userEmail = $_POST['email']);
Post van 05/03/2019 20:05:38 regel 8.
Zodat XSS attacks niet mogelijk worden.
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 -
Omdat de gebruiker een email adres moet opgeven en naar dat email adres wordt het wachtwoord herstel email gestuurd.
Als je nu filter_var() gebruikt om een mailadres te controleren, is het nog fraaier.