PHP mail() function return true but no message

31,369

Solution 1

If mail returns true, then php's job is done. it's handed the email over to your outgoing mail server. You need to check that server's logs to see what happens from that point forward.

e.g. PHP's role in sending an email is basically the equivalent of taking an envelope you hand it, walking down to the street corner, and dropping it into the mailbox. After that, PHP's done and it can report success.

If that mailbox gets nailed by a drunk driver and the mail gets destroyed, that's not PHP's fault. If the mail gets picked up and sent to a postal sorting facility and then gets lost, that's also not PHP's problem.

So go check your mail server's logs. If it can't deliver the mail, it'll report why. If it DID deliver the mail to the destination server, it'll report so, and then you need to find out why the receiving server isn't doing its job - maybe your email is getting flagged as spam and dump in the trash.

Solution 2

Check this directory: C:\xampp\apache\mailoutput

Solution 3

I recently experienced this problem and after many frustrating hours figured out what was causing it, and how to fix it. Hopefully I can save someone else all that trouble.

My php mail() function was returning true, but I wasn't receiving the messages. In my case, it turned out to have nothing to do with PHP after all.

I use Plesk to manage the sites on my server. This particular version of Plesk doesn't allow me to turn mail services on or off for a given website/domain. I host my email elsewhere.

So here's what was happening: PHP mail() was sending messages, the way it was supposed to. But my server was under the impression that it was supposed to receive messages for the particular domain those messages were addressed to. But there was no such mailbox for that domain, because again I host my email elsewhere.

So the messages were never leaving my server.

The solution was for me to go into var/qmail/control and remove the domain names from the "virtualdomains" file, then restart qmail.

Again, I hope this can save someone else all the time and frustration. Gregg

Share:
31,369
Stephanus Budiwijaya
Author by

Stephanus Budiwijaya

Updated on December 10, 2020

Comments

  • Stephanus Budiwijaya
    Stephanus Budiwijaya over 3 years

    This my problem,

    I have a simple PHP script to send email to localhost with mercury mail server and read it with Mozilla Thunderbird. And it's work.

    And then, I upgarde XAMPP version to 1.8.1 and my function return true but no email delivered.

    <?php
    $to = "[email protected]";
    $subject = "Hi!";
    $body="test";
    
    $headers = "From: [email protected]"; 
    
    if (mail($to, $subject, $body, $headers)) {
        echo "Message successfully sent!";
    } else {
        echo "Message delivery failed...";
    }
    ?>
    

    I tried to send email with Thunderbird to [email protected] and it work.

    So iI try to change mail function in php.ini to this but not work

        [mail function]
        ; XAMPP: Comment out this if you want to work with an SMTP Server like Mercury
         SMTP = localhost
         smtp_port = 25
    
        ; For Win32 only.
        ; http://php.net/sendmail-from
        sendmail_from = [email protected]
    
        ; XAMPP IMPORTANT NOTE (1): If XAMPP is installed in a base directory with spaces (e.g. c:\program filesC:\xampp) fakemail and mailtodisk do not work correctly.
        ; XAMPP IMPORTANT NOTE (2): In this case please copy the sendmail or mailtodisk folder in your root folder (e.g. C:\sendmail) and use this for sendmail_path.  
    
        ; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder)
        sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
    
        ; XAMPP: Comment out this if you want to work with mailToDisk, It writes all mails in the C:\xampp\mailoutput folder
        sendmail_path = "C:\xampp\mailtodisk\mailtodisk.exe"
    
        ; Force the addition of the specified parameters to be passed as extra parameters
        ; to the sendmail binary. These parameters will always replace the value of
        ; the 5th parameter to mail(), even in safe mode.
        ;mail.force_extra_parameters =
    
        ; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename
        mail.add_x_header = Off
    
        ; Log all mail() calls including the full path of the script, line #, to address and headers
        ;mail.log = "C:\xampp\php\logs\php_mail.log"
    
    I try to change sendmail.ini to this but not work
    
    ; configuration for fake sendmail
    
    ; if this file doesn't exist, sendmail.exe will look for the settings in
    ; the registry, under HKLM\Software\Sendmail
    
    [sendmail]
    
    ; you must change mail.mydomain.com to your smtp server,
    ; or to IIS's "pickup" directory.  (generally C:\Inetpub\mailroot\Pickup)
    ; emails delivered via IIS's pickup directory cause sendmail to
    ; run quicker, but you won't get error messages back to the calling
    ; application.
    
    smtp_server=localhost
    
    ; smtp port (normally 25)
    
    smtp_port=25
    
    ; SMTPS (SSL) support
    ;   auto = use SSL for port 465, otherwise try to use TLS
    ;   ssl  = alway use SSL
    ;   tls  = always use TLS
    ;   none = never try to use SSL
    
    smtp_ssl=auto
    
    ; the default domain for this server will be read from the registry
    ; this will be appended to email addresses when one isn't provided
    ; if you want to override the value in the registry, uncomment and modify
    
    ;default_domain=mydomain.com
    
    ; log smtp errors to error.log (defaults to same directory as sendmail.exe)
    ; uncomment to enable logging
    
    error_logfile=error.log
    
    ; create debug log as debug.log (defaults to same directory as sendmail.exe)
    ; uncomment to enable debugging
    
    ;debug_logfile=debug.log
    
    ; if your smtp server requires authentication, modify the following two lines
    
    auth_username=
    auth_password=
    
    ; if your smtp server uses pop3 before smtp authentication, modify the 
    ; following three lines.  do not enable unless it is required.
    
    pop3_server=
    pop3_username=
    pop3_password=
    
    ; force the sender to always be the following email address
    ; this will only affect the "MAIL FROM" command, it won't modify 
    ; the "From: " header of the message content
    
    force_sender=
    
    ; force the sender to always be the following email address
    ; this will only affect the "RCTP TO" command, it won't modify 
    ; the "To: " header of the message content
    
    force_recipient=
    
    ; sendmail will use your hostname and your default_domain in the ehlo/helo
    ; smtp greeting.  you can manually set the ehlo/helo name if required
    
    hostname=
    

    Any idea?

  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    Plus, if the mailman was drinking on the job and left his bag at the bar while going to another bar, then that's not the post office's fault, it's the mailman's. Just adding to Marc's "beautifully said" analogy.
  • Stephanus Budiwijaya
    Stephanus Budiwijaya almost 11 years
    I've try to send with PHP but the log of mail server is empty. I've tried to send with thunderbird and it work, and mail server log is no longer empty. So perhaps this is not because the mails server, because i've also tried to change the mail server to argosoft mail server, and no luck. Because this code is work perfectly in previous xampp version. Downgrade maybe? or my php config is wrong?