WPDebugLog

PHP mail() function not working – [Solution]

PHP mail() function not working is a common issue. A better solution is using the SMTP library. phpmailer is good SMTP mail library.

  For testing purpose just create a file and add the following code.  
$sender = 'youremail@domain.tld';
$recipient = 'you@yourdomain.tld';

$subject = "Test mail";
$message = "some php test message";
$headers = 'From:' . $sender;

if (mail($recipient, $subject, $message, $headers)){
    echo "Message accepted";
}else {
    echo "mail function is not working";
}
Most of the shared web server is blocking mail() function to reduce spam emails. You can see commonly mail() function emails are going to spam or junk folder.

Mail function Details:-

mail ( string $to , string $subject , string $message [, mixed $additional_headers  ) It will return boolean (true or false)

How to configure SMTP library ?

Install phpmailer library using composer.  First install composer, if you not installed in your system.
composer require phpmailer/phpmailer
<?php

require 'vendor/autoload.php';

// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

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

// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->SMTPDebug = 2;                                       // Enable verbose debug output
    $mail->isSMTP();                                            // Set mailer to use SMTP
    $mail->Host       = 'smtp1.example.com;smtp2.example.com';  // Specify main and backup SMTP servers
    $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
    $mail->Username   = 'user@example.com';                     // SMTP username
    $mail->Password   = 'secret';                               // SMTP password
    $mail->SMTPSecure = 'tls';                                  // Enable TLS encryption, `ssl` also accepted
    $mail->Port       = 587;                                    // TCP port to connect to

    //Recipients
    $mail->setFrom('from@example.com', 'Mailer');
    $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
    $mail->addAddress('ellen@example.com');               // Name is optional
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    // Attachments
    $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

    // Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'This is the HTML message body <b>in bold!</b>';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
Just post your doubts here.