Skip to main content
6 of 6
added phpmailer code
Vitale
  • 235
  • 2
  • 8

pset7 reset password php mail function doesn't send email

EDIT number 2: I have tried phpmailer instead of mail() function. Please, take a look at the code below. I have created a few email accounts to test the code, none worked: yahoo, gmail, yandex. I am posting one the code that contains one of those accounts including real password. Please, help to get through this. I have the whole pset ready and I have been doing my best to solve the email issue for a second day. I am among less comfortable. I have even tried it with the harvard's address - the one show in the walkthrough froshims-3. https://courses.edx.org/courses/course-v1:HarvardX+CS50+X/courseware/4112040f92094edeba0e5e49b7f1fffe/67c3d981b20f41a69692839397966f2a/

In some instances I get

SMTP Error: Could not connect to SMTP host. Message could not be sent.
Mailer Error: SMTP Error: Could not connect to SMTP host.

In others I get error indicating that authentication failed.

    <?php
    
        // configuration
        require("../includes/config.php");
        require("libphp-phpmailer/class.phpmailer.php");
        
        if (isset($_SESSION["id"]))
        {
            $row = CS50::query("SELECT username, email FROM users WHERE id = ?", $_SESSION["id"]);
            $email = $row[0]["email"];
            $name = $row[0]["username"];
            
            /***
            // wanted to have a secure link, but for now commenting it out
            $salt = "3453#2K:90k≈“π631%380‘“HJK0D*7WPJ987NU";
        // Create the unique user password reset key
        $password = hash('sha512', $salt.$email);
        // url to reset password
        $reset_url = "https://ide50-alla.cs50.io/new_password.php?q=".$password;
        ***/
        
        $reset_url = "https://ide50-alla.cs50.io/new_password.php";
        $mail = new PHPMailer();
        $mail->IsSMTP();
        $mail->SMTPAuth = true;
        $mail->SMTPSecure = "tls";
        
        $mail->Host = "smtp.gmail.com";
        $mail->Port = 587;
        $mail->Username = "[email protected]";
        $mail->Password = "audrey777"; 
        $mail->SetFrom("[email protected]");
        
        $mail->AddAddress($email); 
        $mail->Subject = "Requested link from CS50 Finance web page"; 
        $mail->Body = "Dear $name,\n\nYou have requested to reset your password for CS50 Finance web page.
                       \n\nTo reset your password, please click the link below.\n\n".$reset_url."\n\nThank you!"; 
        
        if(!$mail->Send())
        {
            echo "Message could not be sent. <p>";
            echo "Mailer Error: " . $mail->ErrorInfo;
            apologize("Couldn't send email");
        }
        else
        {
            // render form
            render("email_link_form.php", ["email" => $email]);
        }
                    
    }
    else
    {
        redirect("login.php");
    }

?>

EDIT: my question is not truly a duplicate, because I am asking for help on finding mistakes in my code. But reading about phpmailer() I have realized that mail() function simply doesn't work correctly in many instances.

I am struggling with pset7, but in a happy way because, although it's a hard task, I have learned a lot. Now I am doing reset password part. I am among less comfortable, but happy to learn this fascinating stuff. I will be grateful for help. Please, take a look at the code below. I don't see why mail() function doesn't send an email. I have checked all variables from query(), all are fine, and all display correct values, but email doesn't arrive.

http://php.net/manual/en/function.mail.php

<?php

    // configuration
    require("../includes/config.php");
    
    if (isset($_SESSION["id"]))
    {
        $row = CS50::query("SELECT username, email FROM users WHERE id = ?", $_SESSION["id"]);
        $email = $row[0]["email"];
        $name = $row[0]["username"];
        
        $salt = "3453#2K:90k≈“π631%380‘“HJK0D*7WPJ987NU";
        // Create the unique user password reset key
        $password = hash('sha512', $salt.$email);
        
        // url to reset password
        $reset_url = "https://ide50-name.cs50.io/new_password.php?q=".$password;
        $email_subject = "Requested link from CS50 Finance web page";
        //email the url
        $email_body = "Dear $name,\n\nYou have requested to reset your password for CS50 Finance web page.
                       \n\nTo reset your password, please click the link below.\n\n".$reset_url."\n\nThank you!";
                       
        if(mail($email, $email_subject, $email_body))
        {               
           // render form
           render("email_link_form.php", ["email" => $email]);
        }
    }
    else
    {
        redirect("login.php");
    }

?>

Thank you very much!

Vitale
  • 235
  • 2
  • 8