Search code examples
phppdophpmailer

Send Multiple emails with PHPMailer within while loop


I am trying to send multiple emails within while loop, With the following code its not sending email notification and giving error 'Fatal error: Uncaught Error: Class "PHPMailer" not found in C:\xampp\htdocs\clinic\paients\run_medications.php:98 Stack trace: #0 {main} thrown in'. While the location is correct and its sending single email from another child directory.

require_once('../includes/PHPMailer.php');
require_once('../includes/SMTP.php');
require_once('../includes/Exception.php');
$full_dt = date('Y-m-d H:i:s');
$dt = date('Y-m-d');
$dt_hr = date('H');
$check_timing = $con->prepare("SELECT medication, start_time, end_time FROM timings WHERE HOUR(end_time) = :end ");
$check_timing->bindparam(':end', $dt_hr);
$check_timing->execute();
$count1 = $check_timing->rowCount();
if($count1 > 0) {
while($rows = $check_timing->fetch(PDO:: FETCH_OBJ)) {
  $medication = $rows->medication;
  $start_time = $dt.' '. $rows->start_time;
  $end_time = $dt.' '.$rows->end_time;
  $timestamp = strtotime($end_time) + 60*60;
  $end_hour = date('Y-m-d H:i:s', $timestamp);
    $query = "SELECT a.location_code, b.* FROM patients a INNER JOIN medication b ON a.id = b.pat_id WHERE b.status != 2 AND b.directions = :med AND b.last_time NOT BETWEEN :start AND :end AND :crntime BETWEEN b.start_date AND b.end_date AND :crntime BETWEEN :end AND :end_hour";
    $statement = $con->prepare($query);
    $statement->bindparam(':med', $medication);
    $statement->bindparam(':start', $start_time);
    $statement->bindparam(':end', $end_time);
    $statement->bindparam(':crntime', $full_dt);
    $statement->bindparam(':end_hour', $end_hour);
    $statement->execute();
    $count = $statement->rowCount();
    if($count > 0) {
    while($row = $statement->fetch(PDO:: FETCH_OBJ)) {
            $drug_id = $row->drgid;
            $code = $row->location_code;
            $pat_id = $row->pat_id;
            $drug = $row->med_type.' - '.$row->drug.' ('.$row->strength.')';
            $dose = $row->dosage;
            $route = $row->route;
            $directions = $row->directions;
        
            $getUserName = "SELECT name FROM users WHERE FIND_IN_SET(location_code, :codes)>0 ";
            $runUser = $con->prepare($getUserName);
            $runUser->bindParam(':codes',$code);
            $runUser->execute();
            $check = $runUser->rowCount();
            if($check > 0) {
            $userRow = $runUser->fetch(PDO::FETCH_OBJ);
            $by = $userRow->name;
            }
        
            $insert_report = $con->prepare("
                INSERT INTO  `report` (`med_id`,`pat_id`,`dtime`,`responsible`,`status`) values(:m_id,:p_id,:time,:by,'3')");
            
                $insert_report->bindparam(':m_id',$drug_id);
                $insert_report->bindparam(':p_id',$pat_id);
                $insert_report->bindparam(':time',$end_time);
                $insert_report->bindparam(':by',$by);
                $insert_report->execute();
        
                $mail = new PHPMailer();
                $mail->isSMTP();
                $mail-> SMTPOptions = array (
                'ssl' => array (
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
                )
                );
                $mail->Host = "smtp.gmail.com";
                $mail->SMTPAuth = true;
                $mail->SMTPSecure = "tls";
                $mail->Port = "587";
                $mail->Username = "[email protected]";
                $mail->Password = "12345678";
                $mail->Subject = "Medication Report";
                $mail->setFrom("[email protected]",$by);
                $mail->isHTML(true);
                //Attachment
                    //$mail->addAttachment('img/attachment.png');
                //Email body
                $mail->Body = "<h3>Medication Report by ($by) </h3></br>
                                You are being alerted that <b>$name</b> has missed their $directions Medication $row->med_type. And you may need to take appropriate action..";
                $mail->addAddress($to_email['Email_add']);
                $mail->send();

      } // /while 

    }// if num_rows
  }//while close
}// if num_rows

Solution

  • if you're not using exceptions, you do still need to load the Exception class as it is used internally.

    So, put use at the top of your page like this (I think this is the reason why you're getting undefined error):

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

    Then call files like this :

    require 'path/to/PHPMailer/src/Exception.php';
    require 'path/to/PHPMailer/src/PHPMailer.php';
    require 'path/to/PHPMailer/src/SMTP.php';
    $mail = new PHPMailer\PHPMailer\PHPMailer(true);
    try {
      $mail->SMTPDebug = 0;
      $mail->isSMTP();
      $mail->Host = "smtp.gmail.com";
      $mail->SMTPAuth = true;
      $mail->Username = "[email protected]";
      $mail->Password = "password";
      $mail->Port = 587;
      $mail->setFrom('[email protected]', 'Mailer');
      $mail->addAddress($email);
      $mail->addReplyTo("[email protected]", "Alias");
      $mail->CharSet = "UTF-8";
      $mail->isHTML(true);
      $mail->Subject = $subject;
      $mail->Body = $message;
      $mail->send();
         echo "Mail sent.";
      } catch (Exception $e) {
         echo "Failed. Mailer error: {$mail->ErrorInfo}";
      }
    

    Some times this line use PHPMailer\PHPMailer\PHPMailer; works like this use PHPMailer\PHPMailer; try both ways. but first one will work for you I think.

    I dont use ssl options, if you need it just place it under isSMTP.

    $mail-> SMTPOptions = array (
      'ssl' => array (
      'verify_peer' => false,
      'verify_peer_name' => false,
      'allow_self_signed' => true
      )
    );
    

    Here is the example for sending multiple emails : Send multiple email

    Note: You have to set your gmail account to less secure for apps to use phpmailer.

    Because Gmail has started imposing an authentication mechanism that substitutes SMTP athentication for OAuth2-based authorisation. more info

    Less secure accounts more info , Less secure accounts

    Google is blocking low secure accounts, to your knowledge.