PHP Mailer causing rest of site to not be displayed

the mail() function

Moderators: gesf, Michalio

Post Reply
reddragon88
New php-forum User
New php-forum User
Posts: 2
Joined: Thu Sep 15, 2022 2:05 pm

I am currently designing a website in vs code that uses a login and registration form, mysql database using phpmyadmin via mamp on macos with m1 chip. The problem is, once I implemented PHPMailer, the content of my site won't load.

Here is the registration page:

Code: Select all

<?php
include_once('templates/header.php');
include('config/dbh.php');
include('includes/functions.php');
include('mail/welcomemail.php');

//declare variables
$firstName = $lastName = $phoneNumber = $emailAddress = $companyName = $numberOfUsers = $password = $confirmPassword = "";

$firstErr = $lastErr = $phoneErr = $emailErr = $companyErr = $numUsrErr = $pwErr = $cpwErr = $stmtErr = "";

$errors = array('firstErr' => '', 'lastErr' => '', 'phoneErr' => '', 'emailErr' => '', 'companyErr' => '', 'numUsrErr' => '', 'pwErr' => '', 'cpwErr' => '', 'stmtErr' => '');


if ($_SERVER["REQUEST_METHOD"] == "POST") {

  // first name 
  if (!empty($_POST["firstName"])) {
    $firstName = test_input($_POST["firstName"]);
    if (!preg_match("/^[a-zA-Z\s]+$/", $firstName)) {
      $errors['firstErr'] = " * Only letters and white space allowed";
    }
  } else {
    $errors['firstErr'] = " * Required";
  }

  // last name
  if (!empty($_POST["lastName"])) {
    $lastName = test_input($_POST["lastName"]);
    if (!preg_match("/^[a-zA-Z\s]+$/", $lastName)) {
      $errors['lastErr'] = " * Only letters and white space allowed";
    }
  } else {
    $errors['lastErr'] = " * Required";
  }

  // phone number
  if (!empty($_POST["phoneNumber"])) {
    $phoneNumber = test_input($_POST["phoneNumber"]);
    if (!preg_match("/^[0-9]{10}+$/", $phoneNumber)) {
      $errors['phoneErr'] = " * Must contain 10 digits";
    }
  } else {
    $errors['phoneErr'] = " * Required";
  }

  // email
  if (!empty($_POST["emailAddress"])) {
    $emailAddress = test_input($_POST["emailAddress"]);
    if (!filter_var($emailAddress, FILTER_VALIDATE_EMAIL)) {
      $errors['emailErr'] = " * Invalid email address";
    } else if (emailExists($conn, $emailAddress) == "true") {
      $errors['emailErr'] = " * Email is already in use";
    }
  } else {
    $errors['emailErr'] = " * Required";
  }

  // company
  if (!empty($_POST["companyName"])) {
    $companyName = test_input($_POST["companyName"]);
    if (!preg_match("/^[a-zA-Z0-9\s]+$/", $companyName)) {
      $errors['companyErr'] = " *  Only letters, numbers, and white space allowed";
    }
  } else {
    $errors['companyErr'] = " * Required";
  }

  // number of users
  if (!empty($_POST["numberOfUsers"])) {
    $numberOfUsers = test_input($_POST["numberOfUsers"]);
  } else {
    $errors['numUsrErr'] = " * Required";
  }

  // password
  if (!empty($_POST["password"])) {
    $password = test_input($_POST["password"]);

    $uppercase = preg_match('@[A-Z]@', $password);
    $lowercase = preg_match('@[a-z]@', $password);
    $number = preg_match('@[0-9]@', $password);
    $minchar = "8";

    if (!$uppercase || !$lowercase || !$number || strlen($password) < $minchar) {
      $errors['pwErr'] = " * Requires one uppercase, one lowercase, one number, and at least 8 characters in length";
    }
  } else {
    $errors['pwErr'] = " * Required";
  }

  // confirm password
  if (!empty($_POST["confirmPassword"])) {
    $confirmPassword = test_input($_POST["confirmPassword"]);
    if ($password !== $confirmPassword) {
      $errors['cpwErr'] = " * Passwords must match";
    }
  } else {
    $errors['cpwErr'] = " * Required";
  }

  if (!array_filter($errors)) {
    //generate random secure token 
    $token = openssl_random_pseudo_bytes(16);
    //convert binary to hexadecimal
    $token = bin2hex($token);

    if (createUser($conn, $firstName, $lastName, $phoneNumber, $emailAddress, $companyName, $numberOfUsers, $password, $token) == "true") {
      sendWelcomeEmail($firstName, $emailAddress, $token); // here is where the welcome email is sent
    } else {
      echo "Please try again.";
    }
  }
} //end of post check
?>

<!-- ======= Register Section ======= -->
<section class="get-started" id="get-started">
  <div class="container container-fluid">
    <div class="row">
      <div class="col-md-5 content">
        <form name="register" id="register" method="POST" action="<?= htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
          <div class="form-content">
            <h2 class="form-title">Create Account</h2>
            <div class="err-txt"><?= $errors['stmtErr'] ?></div>
            <hr class="mb-3">

            <div class="form-row">
              <div class="col form-group">
                <label for="firstName">First Name </label><span><?= $errors['firstErr'] ?></span>
                <input name="firstName" id="firstName" class="form-control" type="text" placeholder="First Name" value="<?= htmlspecialchars($firstName) ?>">
              </div>

              <div class="col form-group">
                <label for="lastName">Last Name </label><span><?= $errors['lastErr']; ?></span>
                <input name="lastName" id="lastName" class="form-control" type="text" placeholder="Last Name" value="<?= htmlspecialchars($lastName) ?>">
              </div>
            </div>

            <div class="form-group">
              <label for="phoneNumber">Phone Number </label><span><?= $errors['phoneErr']; ?></span>
              <input name="phoneNumber" id="phoneNumber" class="form-control" type="phoneNumber" placeholder="Phone Number" value="<?= htmlspecialchars($phoneNumber) ?>">
            </div>

            <div class="form-group">
              <label for="emailAddress">Email Address </label><span><?= $errors['emailErr']; ?></span>
              <input name="emailAddress" id="emailAddress" class="form-control" type="email" placeholder="Email" value="<?= htmlspecialchars($emailAddress) ?>">
            </div>

            <div class="form-group">
              <label for="companyName">Company Name </label><span><?= $errors['companyErr']; ?></span>
              <input name="companyName" id="companyName" class="form-control" type="text" placeholder="Company" value="<?= htmlspecialchars($companyName) ?>">
            </div>

            <div class="form-group">
              <label for="numberOfUsers">Number of Users </label><span><?= $errors['numUsrErr']; ?></span>
              <select class="form-control" id="numberOfUsers" name="numberOfUsers">
                <option selected disabled>Choose...</option>
                <option value="1" <?php if (isset($numberOfUsers) && $numberOfUsers == "1") echo "selected" ?>>1</option>
                <option value="2" <?php if (isset($numberOfUsers) && $numberOfUsers == "2") echo "selected" ?>>2</option>
                <option value="3" <?php if (isset($numberOfUsers) && $numberOfUsers == "3") echo "selected" ?>>3</option>
                <option value="4" <?php if (isset($numberOfUsers) && $numberOfUsers == "4") echo "selected" ?>>4</option>
                <option value="5" <?php if (isset($numberOfUsers) && $numberOfUsers == "5") echo "selected" ?>>5</option>
                <option value="6" <?php if (isset($numberOfUsers) && $numberOfUsers == "6") echo "selected" ?>>6</option>
                <option value="7" <?php if (isset($numberOfUsers) && $numberOfUsers == "7") echo "selected" ?>>7</option>
                <option value="8" <?php if (isset($numberOfUsers) && $numberOfUsers == "8") echo "selected" ?>>8</option>
                <option value="9" <?php if (isset($numberOfUsers) && $numberOfUsers == "9") echo "selected" ?>>9</option>
                <option value="10 <?php if (isset($numberOfUsers) && $numberOfUsers == "10") echo "selected" ?>">10</option>
                <option value="11 <?php if (isset($numberOfUsers) && $numberOfUsers == "11") echo "selected" ?>">11</option>
                <option value="12 <?php if (isset($numberOfUsers) && $numberOfUsers == "12") echo "selected" ?>">12</option>
                <option value="13 <?php if (isset($numberOfUsers) && $numberOfUsers == "13") echo "selected" ?>">13</option>
                <option value="14 <?php if (isset($numberOfUsers) && $numberOfUsers == "14") echo "selected" ?>">14</option>
                <option value="15 <?php if (isset($numberOfUsers) && $numberOfUsers == "15") echo "selected" ?>">15</option>
                <option value="16 <?php if (isset($numberOfUsers) && $numberOfUsers == "16") echo "selected" ?>">16</option>
              </select>
            </div>

            <div class="form-group">
              <label for="password">Password </label><span><?= $errors['pwErr']; ?></span>
              <input name="password" id="password" class="form-control" type="password" placeholder="Password" value="">
            </div>

            <div class="form-group">
              <label for="confirmPassword">Confirm Password </label><span><?= $errors['cpwErr']; ?></span>
              <input name="confirmPassword" id="confirmPassword" class="form-control" type="password" placeholder="Confirm Password" value="">
            </div>

            <button id="signupButton" name="register_user" type="submit" class="mt-3 btn btn-custom btn-block">Submit</button>
            <hr class="mb-3">

            <p class="pt-2 text-center small">Already have an account? <a href="login.php"><b>Sign In Here</b></a></p>
          </div>
        </form>
      </div>
    </div>
  </div>
</section>
<?php include('templates/footer.php') ?>

Here is the code for the sendwelcomeemail() function:

Code: Select all

<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

//Load Composer's autoloader
require 'vendor/autoload.php';


function sendWelcomeEmail($firstName, $emailAddress, $token)
{
  $fname = $firstName;
  $usrEmail = $emailAddress;
  $tkn = $token;

  $host = 'mail.*COMPANYNAME*.com;'; // removed for security purposes
  $from = 'mailer@*COMPANYNAME*.com';
  $fromname = '*COMPANYNAME*';
  $mailerpw = '*COMPANYPASSWORD*';

  $subject = 'Verify your email address with *COMPANYNAME*';

  $body = 'Welcome, ' . $fname . '!
  Thank you for creating an account with *COMPANYNAME*.
  Please verify your account and email address by clicking the link below.

  <hr>

  Please click this link to activate your account:
  http://localhost:8888/*COMPANYNAME*/verify.php?email=' . $usrEmail . '&token=' . $tkn . '
    
  ';

  $altbody = '
  
  Welcome, ' . $fname . '!
  Thank you for creating an account with *COMPANYNAME*.
  Please verify your account and email address by clicking the link below.

  Please click this link to activate your account:
  http://www.*COMPANYNAME*.com/verify.php?email=' . $usrEmail . '&token=' . $tkn . '
    
  ';


  $mail = new PHPMailer(true);

  try {

    $mail->isSMTP();
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;
    $mail->Host       = gethostbyname($host);
    $mail->Port       = 25;
    $mail->SMTPAuth   = true;
    $mail->Username   = $from;
    $mail->Password   = $mailerpw;
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;

    $mail->setFrom($from, $fromname);
    $mail->addAddress($usrEmail, $fname);
    $mail->Subject = ("$subject");
    $mail->Body    = $body;
    $mail->AltBody = $altbody;

    $mail->send();
    echo 'message has been sent';
    header("location: login.php?error=none");
  } catch (Exception $e) {
    echo "Message could not be sent. Mailer error: {$mail->ErrorInfo}";
  }
}
User avatar
Michalio
Moderator
Moderator
Posts: 315
Joined: Sun Jul 18, 2021 1:33 pm
Location: Poland

Add error logging:

Code: Select all

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
And show the output. Probably us something wrong with path to the file that you are including.
Addidtionally you should not print any output before you are manipulate the header:

Code: Select all

echo 'message has been sent';
header("location: login.php?error=none");
Free coding lessons: https://php-forum.com/phpforum/viewtopic.php?t=29852
reddragon88
New php-forum User
New php-forum User
Posts: 2
Joined: Thu Sep 15, 2022 2:05 pm

Now the content is loading, the user's information is being saved to the database, and i am receiving this error:

Code: Select all

Source map error: Error: request failed with status 404
Resource URL:  /assets/vendor/swiper/swiper-bundle.min.js
Source Map URL: swiper-bundle.min.js.map
Still no errors in php error log.

All of the functions look as if the email is being sent successfully but it is not being received.
User avatar
Michalio
Moderator
Moderator
Posts: 315
Joined: Sun Jul 18, 2021 1:33 pm
Location: Poland

these lines should display errors on the screen, if you want to log them in to file, you can add this:

Code: Select all

ini_set('error_log', '/tmp/php-error.log');
then you will log the errors to the custom file.
Check also the path to the file, is the file assets/vendor/swiper/swiper-bundle.min.js exists?
Free coding lessons: https://php-forum.com/phpforum/viewtopic.php?t=29852
Post Reply