1

In my server i send mails by PHP but my mails always go to spam folders. I did spf record thing but it didn't matter. Also i use google apps service with this domain. Please Help

Mail Original:

Delivered-To: mektup@gmail.com
Received: by 10.42.178.133 with SMTP id bm5cs95762icb;
        Fri, 31 Dec 2010 19:49:46 -0800 (PST)
Received: by 10.223.112.1 with SMTP id u1mr875459fap.109.1293853785941;
        Fri, 31 Dec 2010 19:49:45 -0800 (PST)
Return-Path: <apache@loft1397.serverloft.eu>
Received: from loft1397.serverloft.eu (loft1397.serverloft.eu [82.25.120.6])
        by mx.google.com with ESMTPS id 17si15455863fau.0.2010.12.31.19.49.45
        (version=TLSv1/SSLv3 cipher=RC4-MD5);
        Fri, 31 Dec 2010 19:49:45 -0800 (PST)
Received-SPF: pass (google.com: best guess record for domain of apache@loft1397.serverloft.eu designates 82.25.120.6 as permitted sender) client-ip=82.25.120.6;
Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of apache@loft1397.serverloft.eu designates 82.25.120.6 as permitted sender) smtp.mail=apache@loft1397.serverloft.eu
Received: from loft1397.serverloft.eu (unknown [127.0.0.1])
    by loft1397.serverloft.eu (Postfix) with ESMTP id 145B623A87F4
    for <mektup@gmail.com>; Sat,  1 Jan 2011 03:49:45 +0000 (UTC)
Received: by loft1397.serverloft.eu (Postfix, from userid 48)
    id EED7623A8831; Sat,  1 Jan 2011 03:49:44 +0000 (UTC)
To: mektup@gmail.com
Subject: Test mail
From: bilgi@xxxx.com
Message-Id: <20110101034944.EED7623A8831@loft1397.serverloft.eu>
Date: Sat,  1 Jan 2011 03:49:44 +0000 (UTC)

Hello! This is a simple email message.

Domain SPF Record: v=spf1 ip4:82.25.120.6 ip4:85.25.122.12 include:_spf.google.com ~all

mTuran
  • 1,846
  • 4
  • 32
  • 58

3 Answers3

3

First off, the very best thing you could possibly do to solve this problem long term is to use a service to send your emails out. There are a lot of them, but I've heard good things about these three:

There is also a new entrant that's supposed to be cool, http://www.emailyak.com/, but they are still in beta. All the services are very affordable, have super simple APIs, and will likely make your problem go away immediately.

If that is not an option, or if you just don't want to go that direction, you're going to need to generate (or get someone to send) a spam report that shows why your messages are going into their spam folder. Here's an example of what I'm talking about from spam assassin:

Content analysis details:   (7.9 points, 6.0 required)

pts rule name              description
---- ---------------------- --------------------------------------------------
3.2 FH_DATE_PAST_20XX      The date is grossly in the future.
1.1 DNS_FROM_OPENWHOIS     RBL: Envelope sender listed in bl.open-whois.org.
0.6 SPF_SOFTFAIL           SPF: sender does not match SPF record (softfail)
0.0 UNPARSEABLE_RELAY      Informational: message has unparseable relay lines
1.6 HTML_IMAGE_ONLY_28     BODY: HTML: images with 2400-2800 bytes of words
0.0 HTML_MESSAGE           BODY: HTML included in message
0.0 BAYES_50               BODY: Bayesian spam probability is 40 to 60%
                           [score: 0.5000]
1.5 MIME_HTML_ONLY         BODY: Message only has text/html MIME parts

Once you have this info, you can diagnose the problem. I doubt it has anything to do with your SPF records, but it's hard to be positive, even though they are listed as "pass" in the headers.

Good luck!

Erick
  • 751
  • 6
  • 6
2

As stated by Erick, Your SPF Is stated as Passed so i would but it down to header malformation in your php main function

This is the code you have:

<?php
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: UzmanKirala <bilgi@uzmankirala.com>\r\n";

$mail_body = "This<br />is<br />a<br />test<br />mail.";
mail('uzmankirala@hotmail.com', 'Subject', $mail_body, $headers);
?>

Google will read this and see that the mail is malformed as there's no boundaries. Lack of correct new lines etc.

I'm not going to bother explaining the whole RFC For the Email Formats but instead point you to a file which I use all the time and works very very well.

<?php
class Mail {
    protected $to;
    protected $from;
    protected $sender;
    protected $subject;
    protected $text;
    protected $html;
    protected $attachments = array();
    public $protocol = 'mail';
    public $hostname;
    public $username;
    public $password;
    public $port = 25;
    public $timeout = 5;
    public $newline = "\n";
    public $crlf = "\r\n";
    public $verp = FALSE;
    public $parameter = '';

    public function setTo($to) {
        $this->to = $to;
    }

    public function setFrom($from) {
        $this->from = $from;
    }

    public function addheader($header, $value) {
        $this->headers[$header] = $value;
    }

    public function setSender($sender) {
        $this->sender = html_entity_decode($sender, ENT_COMPAT, 'UTF-8');
    }

    public function setSubject($subject) {
        $this->subject = html_entity_decode($subject, ENT_COMPAT, 'UTF-8');
    }

    public function setText($text) {
        $this->text = $text;
    }

    public function setHtml($html) {
        $this->html = $html;
    }

    public function addAttachment($file, $filename = '') {
        if (!$filename) {
            $filename = basename($file);
        }

        $this->attachments[] = array(
            'filename' => $filename,
            'file'     => $file
        );
    }

    public function send() {
        if (!$this->to) {
            exit('Error: E-Mail to required!');
        }

        if (!$this->from) {
            exit('Error: E-Mail from required!');
        }

        if (!$this->sender) {
            exit('Error: E-Mail sender required!');
        }

        if (!$this->subject) {
            exit('Error: E-Mail subject required!');
        }

        if ((!$this->text) && (!$this->html)) {
            exit('Error: E-Mail message required!');
        }

        if (is_array($this->to)) {
            $to = implode(',', $this->to);
        } else {
            $to = $this->to;
        }

        $boundary = '----=_NextPart_' . md5(time());

        $header = '';

        if ($this->protocol != 'mail') {
            $header .= 'To: ' . $to . $this->newline;
            $header .= 'Subject: ' . $this->subject . $this->newline;
        }

        $header .= 'From: ' . $this->sender . '<' . $this->from . '>' . $this->newline;
        //$header .= 'From: "' . $this->sender . '" <' . $this->from . '>' . $this->newline;
        $header .= 'Reply-To: ' . $this->sender . '<' . $this->from . '>' . $this->newline;
        $header .= 'Return-Path: ' . $this->from . $this->newline;
        $header .= 'X-Mailer: PHP/' . phpversion() . $this->newline;
        $header .= 'MIME-Version: 1.0' . $this->newline;
        $header .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . $this->newline;

        if (!$this->html) {
            $message  = '--' . $boundary . $this->newline;
            $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline;
            $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline;
            $message .= $this->text . $this->newline;
        } else {
            $message  = '--' . $boundary . $this->newline;
            $message .= 'Content-Type: multipart/alternative; boundary="' . $boundary . '_alt"' . $this->newline . $this->newline;
            $message .= '--' . $boundary . '_alt' . $this->newline;
            $message .= 'Content-Type: text/plain; charset="utf-8"' . $this->newline;
            $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline;

            if ($this->text) {
                $message .= $this->text . $this->newline;
            } else {
                $message .= 'This is a HTML email and your email client software does not support HTML email!' . $this->newline;
            }

            $message .= '--' . $boundary . '_alt' . $this->newline;
            $message .= 'Content-Type: text/html; charset="utf-8"' . $this->newline;
            $message .= 'Content-Transfer-Encoding: 8bit' . $this->newline . $this->newline;
            $message .= $this->html . $this->newline;
            $message .= '--' . $boundary . '_alt--' . $this->newline;
        }

        foreach ($this->attachments as $attachment) {
            if (file_exists($attachment['file'])) {
                $handle = fopen($attachment['file'], 'r');
                $content = fread($handle, filesize($attachment['file']));

                fclose($handle);

                $message .= '--' . $boundary . $this->newline;
                $message .= 'Content-Type: application/octetstream' . $this->newline;
                $message .= 'Content-Transfer-Encoding: base64' . $this->newline;
                $message .= 'Content-Disposition: attachment; filename="' . basename($attachment['filename']) . '"' . $this->newline;
                $message .= 'Content-ID: <' . basename($attachment['filename']) . '>' . $this->newline . $this->newline;
                $message .= chunk_split(base64_encode($content));
            }
        }

        $message .= '--' . $boundary . '--' . $this->newline;

        if ($this->protocol == 'mail') {
            ini_set('sendmail_from', $this->from);

            if ($this->parameter) {
                mail($to, $this->subject, $message, $header, $this->parameter);
            } else {
                mail($to, $this->subject, $message, $header);
            }

        } elseif ($this->protocol == 'smtp') {
            $handle = fsockopen($this->hostname, $this->port, $errno, $errstr, $this->timeout);

            if (!$handle) {
                error_log('Error: ' . $errstr . ' (' . $errno . ')');
            } else {
                if (substr(PHP_OS, 0, 3) != 'WIN') {
                    socket_set_timeout($handle, $this->timeout, 0);
                }

                while ($line = fgets($handle, 515)) {
                    if (substr($line, 3, 1) == ' ') {
                        break;
                    }
                }

                if (substr($this->hostname, 0, 3) == 'tls') {
                    fputs($handle, 'STARTTLS' . $this->crlf);

                    while ($line = fgets($handle, 515)) {
                        $reply .= $line;

                        if (substr($line, 3, 1) == ' ') {
                            break;
                        }
                    }

                    if (substr($reply, 0, 3) != 220) {
                        error_log('Error: STARTTLS not accepted from server!');
                    }
                }

                if (!empty($this->username)  && !empty($this->password)) {
                    fputs($handle, 'EHLO ' . getenv('SERVER_NAME') . $this->crlf);

                    $reply = '';

                    while ($line = fgets($handle, 515)) {
                        $reply .= $line;

                        if (substr($line, 3, 1) == ' ') {
                            break;
                        }
                    }

                    if (substr($reply, 0, 3) != 250) {
                        error_log('Error: EHLO not accepted from server!');
                    }

                    fputs($handle, 'AUTH LOGIN' . $this->crlf);

                    $reply = '';

                    while ($line = fgets($handle, 515)) {
                        $reply .= $line;

                        if (substr($line, 3, 1) == ' ') {
                            break;
                        }
                    }

                    if (substr($reply, 0, 3) != 334) {
                        error_log('Error: AUTH LOGIN not accepted from server!');
                    }

                    fputs($handle, base64_encode($this->username) . $this->crlf);

                    $reply = '';

                    while ($line = fgets($handle, 515)) {
                        $reply .= $line;

                        if (substr($line, 3, 1) == ' ') {
                            break;
                        }
                    }

                    if (substr($reply, 0, 3) != 334) {
                        error_log('Error: Username not accepted from server!');
                    }

                    fputs($handle, base64_encode($this->password) . $this->crlf);

                    $reply = '';

                    while ($line = fgets($handle, 515)) {
                        $reply .= $line;

                        if (substr($line, 3, 1) == ' ') {
                            break;
                        }
                    }

                    if (substr($reply, 0, 3) != 235) {
                        error_log('Error: Password not accepted from server!');
                    }
                } else {
                    fputs($handle, 'HELO ' . getenv('SERVER_NAME') . $this->crlf);

                    $reply = '';

                    while ($line = fgets($handle, 515)) {
                        $reply .= $line;

                        if (substr($line, 3, 1) == ' ') {
                            break;
                        }
                    }

                    if (substr($reply, 0, 3) != 250) {
                        error_log('Error: HELO not accepted from server!');
                    }
                }

                if ($this->verp) {
                    fputs($handle, 'MAIL FROM: <' . $this->from . '>XVERP' . $this->crlf);
                } else {
                    fputs($handle, 'MAIL FROM: <' . $this->from . '>' . $this->crlf);
                }

                $reply = '';

                while ($line = fgets($handle, 515)) {
                    $reply .= $line;

                    if (substr($line, 3, 1) == ' ') {
                        break;
                    }
                }

                if (substr($reply, 0, 3) != 250) {
                    error_log('Error: MAIL FROM not accepted from server!');
                }

                if (!is_array($this->to)) {
                    fputs($handle, 'RCPT TO: <' . $this->to . '>' . $this->crlf);

                    $reply = '';

                    while ($line = fgets($handle, 515)) {
                        $reply .= $line;

                        if (substr($line, 3, 1) == ' ') {
                            break;
                        }
                    }

                    if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) {
                        error_log('Error: RCPT TO not accepted from server!');
                    }
                } else {
                    foreach ($this->to as $recipient) {
                        fputs($handle, 'RCPT TO: <' . $recipient . '>' . $this->crlf);

                        $reply = '';

                        while ($line = fgets($handle, 515)) {
                            $reply .= $line;

                            if (substr($line, 3, 1) == ' ') {
                                break;
                            }
                        }

                        if ((substr($reply, 0, 3) != 250) && (substr($reply, 0, 3) != 251)) {
                            error_log('Error: RCPT TO not accepted from server!');
                        }
                    }
                }

                fputs($handle, 'DATA' . $this->crlf);

                $reply = '';

                while ($line = fgets($handle, 515)) {
                    $reply .= $line;

                    if (substr($line, 3, 1) == ' ') {
                        break;
                    }
                }

                if (substr($reply, 0, 3) != 354) {
                    error_log('Error: DATA not accepted from server!');
                }

                fputs($handle, $header . $message . $this->crlf);
                fputs($handle, '.' . $this->crlf);

                $reply = '';

                while ($line = fgets($handle, 515)) {
                    $reply .= $line;

                    if (substr($line, 3, 1) == ' ') {
                        break;
                    }
                }

                if (substr($reply, 0, 3) != 250) {
                    error_log('Error: DATA not accepted from server!');
                }

                fputs($handle, 'QUIT' . $this->crlf);

                $reply = '';

                while ($line = fgets($handle, 515)) {
                    $reply .= $line;

                    if (substr($line, 3, 1) == ' ') {
                        break;
                    }
                }

                if (substr($reply, 0, 3) != 221) {
                    error_log('Error: QUIT not accepted from server!');
                }

                fclose($handle);
            }
        }
    }
}
?>

Read the class file and unserstand how to use it fully but for now heres a starter example:

$mail = new Mail();

$mail->setTo("mektup@gmail.com");
$mail->setFrom("bilgi@uzmankirala.com");
$mail->setSender("Bilgi");
$mail->setSubject("Test mail");
$mail->setHtml("<b>Some html email</b>");

$mail->send();
RobertPitt
  • 56,863
  • 21
  • 114
  • 161
  • I tried but nothing changed, mail went to spam folder but when i try same code on different server it worked. I think problem is my server but what ? thanks – mTuran Jan 01 '11 at 05:49
  • your IP, must be blacklisted then or the *From* email domain could be blacklisted, chances are it's the IP – RobertPitt Jun 28 '11 at 17:32
  • This certainly solved my problem, I also had SPF pass but was getting spam-canned. Thank you! – Simon Feb 12 '13 at 23:21
  • @RobertPitt this is brilliant approach to solving the problem. It really works with no further adjustments. Spam filters are getting more strict than ever before. The way you structure your e-mail content also matters. You are more likely to succeed with Html than plain text e-mails. Even though, the coding of the Html e-mail must meet specific coding standards or else the e-mail may not get delivered at all. – DataPriest Mar 15 '13 at 05:18
0

Did you make DNS setting to send mails from you site. Without doing that you the mail-receiver will not identify you thus sending your mails to spam. Talk to your hosting support they will guide you to do such DNS settings.

Naresh
  • 785
  • 1
  • 11
  • 23