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:
<?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');
?>

Van het andere contact formulier dat werkte is dit mijn code:
<?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();

?>
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,

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?
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.
Ik heb nu dit erin gezet:

<?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:
<?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();
}
?>

Zoals u ziet, staat "?error=invalidrequest" nergens.
Je wilt dingen in afzondering testen.

Ga dus eerst na of mailfunctionaliteit in eerste instantie uberhaupt werkt.
Ik heb tijdelijk dit even neergezet:

<?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';
}
?>

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

[size=xsmall]Toevoeging op 05/03/2019 20:43:19:[/size]

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.
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.
Ik heb nu dit erin gezet:

<?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();
}
?>

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?
Heb je een SPF en DKIM record in de DNS van je domein staan? Vraag dit anders eens aan je hosting.

Reageren