绕过Gmail的垃圾邮件过滤器(使用PHP从共享主机发送的邮件)

时间:2013-03-07 14:46:17

标签: php email spam swiftmailer spam-prevention

TL; DR:从共享主机发送的邮件(例如来自Unoeuro或One.com的廉价域名)最终会收到垃圾邮件。怎么解决?


我制作了一个邮件系统,首先生成一个PDF文件(使用FPDF),然后将PDF文件作为附件发送给PHP的Swiftmailer。这封电子邮件已发送给130人(作为“一张发票”)。但是几乎每个人都陷入垃圾邮件过滤器。我尝试调整SwiftMailers标头设置,但没有任何运气。即使是我以前没有寄过的邮件(经过全面测试)。这是我最初的设置:

function sendMailEt($toEmail, $toName, $invoiceNumber){

require_once('includes/lib/swift_required.php');

$transport = Swift_SmtpTransport::newInstance('mailout.one.com', 25)
  ->setUsername('EMAIL-ACCOUNT1@THE-DOMAIN.DK')
  ->setPassword('THE-PASSWORD')
  ;    

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('FROM COMPANY')
      ->setSubject('Thanks for signing up - COMPANY')
  ->setFrom(array('EMAIL-ACCOUNT1@THE-DOMAIN.DK' => 'Company name'))
  ->setTo(array($toEmail => $toName))
      ->setBody('A brief body, that explains that this is an invoice and that it has to be paid within 5 days. (written in danish)')
      ->addPart('A brief body, that explains that this is an invoice and that it has to be paid within 5 days. (written in danish)', 'text/html')

   ->attach(Swift_Attachment::fromPath('/URL-TO-THE-PDF-FILE.pdf'))
  ;

$result = $mailer->send($message);
}

我还尝试使用PHP的原生mail() - 函数发送电子邮件,然后只需链接到发票(http://www.company-domain-name.dk/invoice/base64_encoded-name.pdf)...相同的结果(垃圾邮件)。

我自己尝试编写整个标题。我已经阅读了大量有关标题应该包含的论坛,但它们都写了不同的东西。所以我尝试了一些不同的东西(我以前寄过的电子邮件和我没有发过的电子邮件)......同样的结果(垃圾邮件)。

然后我尝试完全按照MailChimps的标题编写标题。这让我想到了这个:

 $headers = "Reply-To: Company name <UNUSED-EMAIL-ACCOUNT-FROM-DOMAIN@DOMAIN-NAME.DK>\r\n"; 
 $headers .= "Return-Path: Company name <UNUSED-EMAIL-ACCOUNT-FROM-DOMAIN@DOMAIN-NAME.DK>\r\n"; 
 $headers .= "From: Message from Company name <UNUSED-EMAIL-ACCOUNT-FROM-DOMAIN@DOMAIN-NAME.DK>\r\n"; 
 $headers .= "MIME-Version: 1.0\r\n";
 $headers .= "Sender: Message from Company name <UNUSED-EMAIL-ACCOUNT-FROM-DOMAIN@DOMAIN-NAME.DK>\r\n";
 $headers .= "Content-type: text/plain; charset=\"utf-8\"; \r\n";
 $headers .= "X-Mailer: PHP". phpversion() ."\r\n";

然后我发送这样的邮件:

mail($toName . '<'.$toEmail.'>', utf8_decode('Faktura på depositumet'), utf8_decode($someMessage), $headers);

...同样的结果(垃圾邮件)。

网站空间与One.com一起使用,因此我无法使用PHPmailer(因为必须安装,而且无法在one.com的服务器上完成)。我无法使用One.com定义SPF。

我想要的只是发送不会发送垃圾邮件的电子邮件。

以下是我的问题:

  1. 是因为我的标题已关闭,还是“更深层次”?

  2. Gmail垃圾邮件过滤器是否禁止使用单个电子邮件帐户(例如 this@example.com)或禁止整个域名(例如 @example.com)?

  3. 可以将列入黑名单的电子邮件列入白名单 不知何故?

  4. *加1 *

    好的......我现在尝试了很多东西:

    • 我尝试添加LoneWolfPR的返回路径,就像推荐的那样,并没有帮助。
    • 我联系了One.com(托管公司),并与他们确认,无法设置SPF记录或DKIM记录。它仍然不是。
    • 我考虑过建立一个“取消订阅”链接,链接指向带有表单的网站,但我不相信这种做法。我的意思是 - 通过电子邮件随时发送发票。为什么你能取消订阅发票?!由于这在我脑海中的感觉很远,所以我只尝试了大约20分钟(显然,没有结果)。

    以下是我当前的电子邮件标题(通过点击“查看原始文件”从Gmail获取):

    Delivered-To: NEWLY-CREATED-GMAIL-ACCOUNT@gmail.com
    Received: by 10.76.75.104 with SMTP id b8csp48728oaw;
            Sat, 16 Mar 2013 17:32:56 -0700 (PDT)
    X-Received: by 10.152.116.45 with SMTP id jt13mr7897860lab.0.1363480376067;
            Sat, 16 Mar 2013 17:32:56 -0700 (PDT)
    Return-Path: <XXX111@DOMAIN-NAME.dk>
    Received: from mail-out2.b-one.net (mail-out2.one.com. [91.198.169.19])
            by mx.google.com with ESMTP id p10si4637427lbb.120.2013.03.16.17.32.55;
            Sat, 16 Mar 2013 17:32:55 -0700 (PDT)
    Received-SPF: neutral (google.com: 91.198.169.19 is neither permitted nor denied by best guess record for domain of XXX111@DOMAIN-NAME.dk) client-ip=91.198.169.19;
    Authentication-Results: mx.google.com;
           spf=neutral (google.com: 91.198.169.19 is neither permitted nor denied by best guess record for domain of XXX111@DOMAIN-NAME.dk) smtp.mail=XXX111@DOMAIN-NAME.dk
    Date: Sat, 16 Mar 2013 17:32:55 -0700 (PDT)
    Message-Id: <51450f37.6a0b700a.6239.5dbcSMTPIN_ADDED_MISSING@mx.google.com>
    Received: from localhost.localdomain (srv18.one.com [193.202.110.18])
        by mail-out2.b-one.net (Postfix) with ESMTP id F3D0B10365
        for <NEWLY-CREATED-GMAIL-ACCOUNT@gmail.com>; Sun, 17 Mar 2013 01:32:53 +0100 (CET)
    Received: from 85.218.159.219 by www.DOMAIN-NAME.dk via URL_TO_THE_SCRIPT.php with HTTP; Sun, 17 Mar 2013 00:32:53 +0000
    To: RECIEVERS_NAME <NEWLY-CREATED-GMAIL-ACCOUNT@gmail.com>
    Subject: EMAIL-SUBJECT
    X-PHP-Originating-Script: 87486:NAME-OF-THE-SCRIPT-THE-E-MAIL-WAS-SENT-FROM.php
    Reply-To: COMPANY NAME <XXX111@DOMAIN-NAME.dk>
    From: Besked fra COMPANY NAME <XXX111@DOMAIN-NAME.dk>
    MIME-Version: 1.0
    Sender: Besked fra COMPANY NAME <XXX111@DOMAIN-NAME.dk>
    Content-type: text/plain; charset="utf-8"; 
    X-Mailer: PHP5.3.21
    

5 个答案:

答案 0 :(得分:13)

1)通常情况下,电子邮件地址不会轻易进入黑名单,需要时间和/或很多人将您标记为垃圾邮件发送者,才能将该地址实际列入黑名单。

2)是的。整个域名可以列入黑名单,因为垃圾邮件发送者通常会生成随机的电子邮件地址,如f4j3ifl@something.com。

3)它与spambox的次数无关紧要,基本上,垃圾邮件过滤器现在很强大,因为垃圾邮件发送者试图改善他们日复一日的方式,所以过滤器每天都变得越来越严格。如果它第一次进入垃圾邮件文件夹,并且用户实际上没有将其放入垃圾邮件箱,它将继续运行,除非用户取消标记,或者您解决了问题。

如何避免spambox?

基本上你需要一些签名,并且需要大量访问你的DNS记录,因为我们将在那里完成大部分设置。

  • 反向DNS查询:在专用服务器上甚至在某些VPS上,您可以设置反向DNS记录,有时您只需打开一张票据并由IT为您设置。如果您无法拥有它,请更改您的主机或继续标记为垃圾邮件发送者xD。这是为了防止标题伪造,因为您可以在标题上设置您的电子邮件来自gmail.com,但这不是电子邮件服务器检查它的方式。

  • SPF也是必备的,如果您无法设置SPF,那么甚至不再尝试,请考虑更改您的托管,您几乎可以停止阅读这里是xD。

  • DKIM /域密钥:最好是DKIM,是加密签名,您在DNS上设置公钥,并在服务器收到时在您的电子邮件服务器中存储私钥电子邮件,它在标题中附加了私钥(你需要一个管理DKIM的邮件服务器软件,例如它对我来说是工作的 hmailserver ),而邮件服务(例如gmail)会检查你的dns记录以查看公钥是否匹配。 这几乎也是必须的


这三个是基础知识,如果您设置DMARC和ADSP,它将为您提供SpamAssassins的更好分数。为了获得更好的分数搜索谷歌上的一些垃圾邮件关键字列表,并试图避免它们,一些东西,如用“亲爱的xxx”开始发送电子邮件对你的分数有害,设置未取消的系统(即使它很糟糕,只要很长时间因为你提供了明确的链接)也会对你有所帮助。

此外:

  • 在任何背景下避免使用草率的html和白色文本,一些垃圾邮件发送者使用它来填充隐藏文本,这些过滤器比你想象的要聪明。

  • 阅读具体建议。大多数电子邮件服务都在其网站上提供了常见问题解答或其他一些提示,以帮助您发送电子邮件而不是进入垃圾邮件。在其中一些你甚至可以申请进入白名单(至少在几年前,在一些服务,如gmail,他们不再这样做)

  • 如果您批量发送,请留意时间!如果您每秒都有X封电子邮件发送到某个地方,您很可能会进入黑名单,设置脚本或其他东西以获得1秒的延迟,延迟可能取决于目的地是否进入黑名单。


希望这些提示可以帮到你,我最近不得不处理一些垃圾邮件过滤器,这是一个痛苦的屁股,这就是为什么我知道所有这些信息,这就是我所有的研究xD即使在我设置的所有签名和事情之后,一些电子邮件仍然进入spambox(较小的百分比,但它仍然伤害我)唯一可靠的方法是让用户将您添加到联系人列表(同时正确签名和标题),所以提醒他们做所以如果可能的话。

答案 1 :(得分:3)

要记住一件事,我遇到了Gmail和Yahoo!阻止电子邮件的问题。来自php的邮件,因为Return-Path标头与from不匹配。在许多服务器上,如果您在标头中明确设置了Return-Path,PHP Mail将忽略它并设置返回路径到机器名称。你必须使用'-f'标志强制它在邮件功能的'附加参数'部分。现在我从来没有使用过Swift Mailer,所以我不知道它与PHP的本机mail()函数相同,但是这就是使用mail()的样子;

mail($to,$subject,$message,$headers,'-f returnpath@example.com')

如果你能在swift邮件中找到相同的内容,它可以解决你的问题。

编辑:

看起来你根本就没有设置Return-Path。我知道GMail真的不喜欢被遗漏。尝试将其明确设置为您的Swift_Mailer消息(并确保它与您的From匹配):

$message->setReturnPath('from@example.com');

答案 2 :(得分:1)

解决方案:使用Mailgun(未经测试)或Sendgrid(测试并创造奇迹!)。这两者之间存在价格差异 - 但简而言之:如果你小的话,Mailgun是好的;如果你很大的话,Sendgrid很好。

要么是,要么使用MailChimps API或其他东西发送邮件。它无法在共享主机上修复(最有可能)。原因如下。


解释:我后来了解了有关共享主机如何工作的更多信息。想象一下,几个不同的站点位于同一台服务器上(例如domain-1.orgdomain-2.orgdomain-3.org)。这意味着如果domain-3.org发送了大量垃圾邮件,那么Gmail(以及其他垃圾邮件过滤器)会将该IP地址标记为垃圾邮件。因此,如果domain-2.org然后发送内容,那么(可能)来自某个IP地址,因此最终会发送垃圾邮件。共享主机无法真正做任何事情(并不关心,因为很少有人有这个问题)。这就是它如此便宜的原因。

Sendgrid和Mailguns IP地址被所有垃圾邮件过滤器标记为“正常”,这就是您为它们付费的服务。他们通过监控您发送的电子邮件被标记为“垃圾邮件”的方式保持这种状态。如果它是5%-10%或者疯狂的东西,那么Sendgrid / Mailgun将阻止你的帐户,直到你修复它(经过漫长的过程,你必须联系他们的客户服务并做1.000冰雹玛丽和各种奇怪的东西)。

我听说如果你有自己的服务器(价格更贵),并设置自己的邮件服务器,那么你必须非常小心,不要被标记为垃圾邮件。因为垃圾邮件过滤器现在真的很难......

答案 3 :(得分:0)

确保您用作FROM的电子邮件地址实际上是一个电子邮件地址。通过从主机(one.com为您)进入我的帐户管理并添加我希望电子邮件来自的帐户,我已经解决了同样的问题。我添加了一个名为“邮件程序”的帐户,通过面板,我能够设置一个自动回复程序,上面写着“抱歉。这个电子邮件地址是为服务器功能保留的。”

在您要使用的from标题中(mailer@yourdomain.com)

拥有实际的电子邮件地址和自动回复功能。我认为gmail足够聪明,知道以前从未使用过的电子邮件地址是垃圾邮件。此外,电子邮件地址必须来自脚本所在的域,以便当它说它来自那里时它不会说谎。

这是我想要从我的共享主机(justhost.com)发送电子邮件时使用的代码,它不会转到垃圾邮件(这是使用来自网络表单的帖子数据):

<?php



// Contact subject

$subject = $_POST["subject"];



// Details

$message=$_POST["detail"];



// Email of sender

$mail_from=$_POST["customer_mail"]; 

//Name of sender

$name=$_POST["name"];
putenv("TZ=America/Phoenix");
$now = date("F j, Y, g:i a T");

$header="Reply-To: $name <$mail_from>";

$header .= "From: MyDomainName.com <mailer@mydomainname.com>";
$header .= "\r\n";
$header .= "Reply-To: $name <$mail_from>"; 
$introMSG= "Message From:".$name." <".$mail_from.">"."\r\n"
."Sent On:".$now."\r\n"."From a web form on MyDomaiNname.com"."\r\n"."-----------
-----------------------"."\r\n"."\r\n";


$to ='me@mydomainname.com'; // Domain Owners Email Address

$send_contact=mail($to,$subject,$introMSG.$message,$header);

$send_copy=mail($mail_from,"Copy Of:".$subject,$introMSG.$message,$header);

// Check if message sent


if($send_contact){

echo "<strong>Thanks! Your message has been sent to me.</strong>";

}

else {

echo "<strong>There was an error sending your message </strong>"; 

}



if($send_copy){
echo "<strong><br>A copy of this message was sent to your email.<br>If you do not
receive a copy please check your spam folder</strong>";

}

else{
echo "<strong> There was an error sending a copy of this message to your email
</strong>"; 

}



$send_reminder=mail("5555555555@txt.att.net","","You Have a new contact message from
".$name.", remember to check your spam folder.",$header);

if($send_reminder){

echo ".";

}

else {

echo "<br><strong>TXT Error</strong>";

}

?>

答案 4 :(得分:0)

至少有两个“垃圾邮件”外观从您的电子邮件标题中跳出来:

Message-Id: <51450f37.6a0b700a.6239.5dbcSMTPIN_ADDED_MISSING@mx.google.com>

请注意 SMTPIN_ADDED_MISSING 部分?您的行为不像正确的邮件程序并生成唯一的Message-ID。您可能会发现阅读RFC 5322是指导性的。

Received: from localhost.localdomain (srv18.one.com [193.202.110.18])
by mail-out2.b-one.net (Postfix) with ESMTP id F3D0B10365
for <NEWLY-CREATED-GMAIL-ACCOUNT@gmail.com>; Sun, 17 Mar 2013 01:32:53 +0100 (CET)

初始收到的标头有一个非法的HELO主机名(localhost.localdomain)。您的邮件程序应用为您提供将其设置为有效值的方法。它甚至可以像配置运行PHP的机器的主机名一样简单。请参阅RFC 1035(主机名有效性),RFC 2821(SMTP)和RFC 5321(SMTP)。