sending email via php mail function goes to spam

152,628

Solution 1

The problem is simple that the PHP-Mail function is not using a well configured SMTP Server.

Nowadays Email-Clients and Servers perform massive checks on the emails sending server, like Reverse-DNS-Lookups, Graylisting and whatevs. All this tests will fail with the php mail() function. If you are using a dynamic ip, its even worse.

Use the PHPMailer-Class and configure it to use smtp-auth along with a well configured, dedicated SMTP Server (either a local one, or a remote one) and your problems are gone.

https://github.com/PHPMailer/PHPMailer

Solution 2

Try changing your headers to this:

$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: [email protected]" . "\r\n" .
"Reply-To: [email protected]" . "\r\n" .
"X-Mailer: PHP/" . phpversion();

For a few reasons.

  • One of which is the need of a Reply-To and,

  • The use of apostrophes instead of double-quotes. Those two things in my experience with forms, is usually what triggers a message ending up in the Spam box.

You could also try changing the $from to:

$from = "[email protected]";


EDIT:

See these links I found on the subject https://stackoverflow.com/a/9988544/1415724 and https://stackoverflow.com/a/16717647/1415724 and https://stackoverflow.com/a/9899837/1415724

https://stackoverflow.com/a/5944155/1415724 and https://stackoverflow.com/a/6532320/1415724

  • Try using the SMTP server of your ISP.

    Using this apparently worked for many: X-MSMail-Priority: High

http://www.webhostingtalk.com/showthread.php?t=931932

"My host helped me to enable DomainKeys and SPF Records on my domain and now when I send a test message to my Hotmail address it doesn't end up in Junk. It was actually really easy to enable these settings in cPanel under Email Authentication. I can't believe I never saw that before. It only works with sending through SMTP using phpmailer by the way. Any other way it still is marked as spam."

PHPmailer sending mail to spam in hotmail. how to fix http://pastebin.com/QdQUrfax

Solution 3

If you are sending this through your own mail server you might need to add a "Sender" header which will contain an email address of from your own domain. Gmail will probably be spamming the email because the FROM address is a gmail address but has not been sent from their own server.

Solution 4

What we usually do with e-mail, preventing spam-folders as the end destination, is using either Gmail as the smtp server or Mandrill as the smtp server.

Share:
152,628
Dinesh Nagar
Author by

Dinesh Nagar

{ location: "Greater Noida, India" ,  name: "Dinesh Nagar" ,  title: [ "Developer", "Architect" ] ,  skills: {        frontEnd: [               "java-script", "html5", "css3",             , "canvas", "angular.js", "react.js", "ajax", "jQuery"         ]      ,  backEnd: [               "php","c#","unity3D", "node.js", "meteor", "express", "zend", "mysql", "mongoDB"         ]      ,  other: [              "Cricket", "Travelling"         ]     } }

Updated on May 02, 2021

Comments

  • Dinesh Nagar
    Dinesh Nagar about 3 years

    I am facing problem in sending mail to my inbox (gmail account) but everytime it goes to spam folder.

    Here is the code snippet

         //$ticketDetail is array which contain required information to send.
           sendOwnershipEmail('[email protected]', $ticketDetail);
        
           function sendOwnershipEmail($email, $ticketDetail) {
                $param = new stdClass();
       
    
    $param->content = "<div>
        <div><b>".$ticketDetail[0]['ticket_number']."</b></div><br/>
        <div><img src='".$ticketDetail[0]['image_path']."'/></div><br/>
        <div>Ticket with ticket number ".$ticketDetail[0]['ticket_number']." has been requested for tranfer from <div/>
        <div>".$ticketDetail[0]['oldDepartment']." to ".$ticketDetail[0]['newDepartment']." Department <div/>
      </div>";
                
                $param->sendTo = $email;
                $param->subject = "Request for Department transfer";
                
            sendMailFunction($param);
        }
        
        
        function sendMailFunction($param) {
                $to = $param->sendTo;
                $subject = $param->subject;
                $headers = 'MIME-Version: 1.0' . "\r\n";
                $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
                $headers .= 'From: [email protected]' . "\r\n";
                $message = "<html><head>" .
                       "<meta http-equiv='Content-Language' content='en-us'>" .
                       "<meta http-equiv='Content-Type' content='text/html; charset=windows-1252'>" .
                       "</head><body>" .$param->content.        
                       "<br><br></body></html>";
              mail($to, $subject, $message, $headers);
        }
    

    And I have tried a lot like setting headers as Reply-To, Return-Path etc but every time it goes to spam.

    Can you please figure out whats the problem?

  • Dinesh Nagar
    Dinesh Nagar almost 11 years
    Hi Fred tried your suggested changes but didn't solve problem. any other idea?
  • Lenin
    Lenin almost 11 years
    If by apostrophes you meant single quotes: stackoverflow.com/questions/3446216/… What would the $from do in that script?
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    @Lenin I call them apostrophes. For example I've just used one now. As for 'single quotes' are the same character on my/the keyboard.
  • Dinesh Nagar
    Dinesh Nagar almost 11 years
    ok i just added $from variable for testing purpose like passing fifth parameter in php mail function.
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    Hi @DineshNagar. Very strange. I used single quotes in headers before and they always landed in the Spam box. When I switched to double quotes, all was fine.
  • Lenin
    Lenin almost 11 years
    Please read the thread I shared. Single quotes do not parse strings. He rather used them correctly in most places.
  • Lenin
    Lenin almost 11 years
    @DineshNagar there's no place for fifth parameter if you do not enclose it with the necessary HTML in mail() php.net/manual/en/function.mail.php
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    @Lenin Yes I am familiar with that same post/article. However and contrary to popular belief, is not an exact science, so I beg to differ on that subject, yet I am not denying it neither. Many modify headers to their liking, skipping certain steps etc. With the forms I build, I always follow the same steps and never have I had one end up in the Spam box. That is by "my" own experience of course. However that article does not mention anything about mail() and is a completely different "animal".
  • Lenin
    Lenin almost 11 years
    SO answers should not come up with just opinions. Single quotes used correctly does the job well. He rather used the double quotes wrong in the following: ` "<meta http-equiv='Content-Language' content='en-us'>" . "<meta http-equiv='Content-Type' content='text/html; charset=windows-1252'>" `
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    @DineshNagar I just noticed something. Try it again, yet make sure there are dots to concatenate the headers and that the first one has none before the = sign, but all others will have .= I missed a dot in the second one in my answer.
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    @Lenin Those are not part of the headers Lenin. That is completely seperate. (meta tags) and they can be used.
  • Dinesh Nagar
    Dinesh Nagar almost 11 years
    Fred i already added .= for headers that u missed in your answer but problem still exist.
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    @DineshNagar Hmm... well I noticed something that may be breaking something. You have a few <div/> that need to be changed to </div> try that. I've seen broken DIVs halt scripts altogether, last week actually.
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    @DineshNagar I'm curious about this $param->content = "<div> how is that being used?
  • Dinesh Nagar
    Dinesh Nagar almost 11 years
    $param->content = "<div>....</div>" just for creating message along with image and finally embeded this in sendMailFunction() function's message variable.
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    @DineshNagar I added a few links for you to look into. Look under my EDIT, I hope you will be able to find some answers in there. I am at a loss now.
  • Funk Forty Niner
    Funk Forty Niner almost 11 years
    @DineshNagar So, any luck with the added info I included?
  • Dinesh Nagar
    Dinesh Nagar almost 11 years
    Ahh pain only still goes to spam :(