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
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.
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("[email protected]");
$mail->setFrom("[email protected]");
$mail->setSender("Bilgi");
$mail->setSubject("Test mail");
$mail->setHtml("<b>Some html email</b>");
$mail->send();
您是否进行了 DNS 设置以从您的站点发送邮件。如果不这样做,邮件接收者将无法识别您的身份,从而将您的邮件发送到垃圾邮件。与您的托管支持人员联系,他们将指导您进行此类 DNS 设置。
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.
发布评论
评论(3)
首先,从长远来看,要解决这个问题,最好的办法就是使用服务发送电子邮件。它们有很多,但我听说过关于这三个的好消息:
还有一个新成员应该很酷,http://www.emailyak.com/,但它们仍处于测试阶段。所有服务都非常实惠,具有超级简单的 API,并且很可能会立即解决您的问题。
如果这不是一个选项,或者如果您只是不想朝这个方向发展,则您将需要生成(或让某人发送)垃圾邮件报告,以显示您的邮件为何进入垃圾邮件文件夹。以下是我从垃圾邮件刺客那里谈论的示例:
一旦获得此信息,您就可以诊断问题。我怀疑这与您的 SPF 记录有任何关系,但很难肯定,即使它们在标题中列为“通过”。
祝你好运!
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:
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)所述,您的 SPF 被声明为“通过”,所以我会,但它归结于您的 php 主函数中的标头格式
这是您的代码:
Google 将阅读此内容并发现邮件格式错误,因为没有边界。缺少正确的换行符等。
我不会费心解释电子邮件格式的整个 RFC,而是向您指出一个我一直使用并且工作得非常好的文件。
阅读类文件并理解如何充分使用它,但现在这里有一个入门示例:
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:
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.
Read the class file and unserstand how to use it fully but for now heres a starter example:
您是否进行了 DNS 设置以从您的站点发送邮件。如果不这样做,邮件接收者将无法识别您的身份,从而将您的邮件发送到垃圾邮件。与您的托管支持人员联系,他们将指导您进行此类 DNS 设置。
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.