Using wp_mail() instead of mail() in WordPress does not work

Since PHP mail has been disabled on my server it has stopped a theme integrated contact form from working.

The theme is called Boldy and it has its own sendmail.php file which uses mail() instead of wp_mail().

Read More

Changing mail() to wp_mail() does not work, but I’m not sure why?

<?php
if (isset($_POST['submit']))
{
    error_reporting(E_NOTICE);

    function valid_email($str)
    {
        return ( ! preg_match("/^([a-z0-9+_-]+)(.[a-z0-9+_-]+)*@([a-z0-9-]+.)+[a-z]{2,6}$/ix", $str)) ? FALSE : TRUE;
    }

    if ($_POST['name'] != '' && $_POST['email'] != '' && valid_email($_POST['email']) == TRUE && strlen($_POST['comment']) > 1)
    {
        $to = preg_replace("([rn])", "", $_POST['receiver']);
        $from = preg_replace("([rn])", "", $_POST['email']);
        $subject = "Website contact message from ".$_POST['name'];
        $message = $_POST['comment'];
        $match = "/(bcc:|cc:|content-type:)/i";

        if (preg_match($match, $to) || preg_match($match, $from) || preg_match($match, $message))
        {
            die("Header injection detected.");
        }

        $headers = "From: ".$from."rn";
        $headers .= "Reply-to: ".$from."rn";

        if (mail($to, $subject, $message, $headers))
        {
            echo 1; //SUCCESS
        }
        else
        {
            echo 2; //FAILURE - server failure
        }
    }
    else
    {
        echo 3; //FAILURE - not valid email
    }

}
else
{
    die("Direct access not allowed!");
}
?>

Related posts

Leave a Reply

4 comments

  1. I’ve lost about 30 minutes figuring this out.

    If you’re using anything that allows you to configure SMTP within WordPress, take it out.

    Then put everything into a function:

    add_action('init','delay_until_init');
    function delay_until_init(){
       // call wp_mail() here
    }
    
  2. By default, the WordPress function wp_mail() uses PHPs internal mail() function so the change you’ve made won’t fix the issue.

    If your web server has disabled the standard PHP mail() function then you will need to switch over to using SMTP for sending your emails.

    There’s a few different ways to achieve this, but the easiest method I’ve found has been to use the Easy WP SMTP plugin. Once installed, you’ll need to configure the plugin to use the login details for your SMTP server. If you hvae a Gmail address, you can use those details for setting it up.

    EDIT: You still need to switch your code over to using the wp_mail() function which will automatically use SMTP (if you have the WP SMTP plugin installed).