如何发送电子邮件并避免它们被归类为垃圾邮件?

kco*_*ode 92 email spam spam-filter

这是一个关于如何处理从您的服务器发送的电子邮件被错误分类为垃圾邮件的规范问题。有关其他信息,您可能会发现以下类似问题很有帮助:

有时我想向我的客户发送时事通讯。问题是,有些电子邮件会被当作垃圾邮件。主要通过客户端的 Outlook(甚至在我自己的 Outlook 2007 中)。

现在我想知道应该做什么来创建“好”的电子邮件。我知道反向查找等,但是(例如)具有唯一 ID 的取消订阅链接呢?这会增加垃圾邮件评级吗?

spl*_*tne 88

确保您的电子邮件看起来不像典型的垃圾邮件:不要只插入大图片;检查字符集设置是否正确;不要插入“仅 IP 地址”链接。像写普通电子邮件一样写你的通信。让退订或退出变得非常容易。否则,您的用户将通过按“垃圾邮件”按钮退订,这将影响您的声誉。

在技​​术方面:如果您可以选择 SMTP 服务器,请确保它是“干净”的 SMTP 服务器。垃圾邮件 SMTP 服务器的 IP 地址通常被其他提供商列入黑名单。如果您事先不知道您的 SMTP 服务器,最好在您的应用程序中提供配置选项来控制批次大小和批次之间的延迟。某些邮件服务器不接受大批量发送或连续活动。

使用电子邮件身份验证方法,例如SPFDKIM来证明您的电子邮件和您的域名属于一起。好的副作用是您可以帮助防止您的电子邮件域被欺骗。还要检查您的反向 DNS,以确保您的邮件服务器的 IP 地址指向您用于发送邮件的域名。

确保电子邮件的回复地址是有效的现有地址。在收件人字段中使用收件人的完整、真实姓名,而不仅仅是电子邮件地址(例如"John Doe" <john.doe@example.com>)并监控您的滥用帐户,例如abuse@example.compostmaster@example.com


小智 22

自动退订电子邮件地址被退回的邮件收件人,并与主要邮件提供商建立投诉反馈循环,并自动退订将您的邮件报告为垃圾邮件/垃圾邮件的收件人。这将对提高您的声誉和可交付性大有帮助。

  • 这是非常有趣的。我对这些反馈循环一无所知。是否所有提供商都提供这样的计划? (4认同)

Chr*_*s S 16

这个问题提到了基础知识已经到位,但是当我们将其他人作为规范问题指出这个问题时,我只想确保我们涵盖了我们的基础。

这些天基本上需要这些最低要求:

  1. 确保正确配置了正向和反向 DNS。邮件服务器必须在 HELO/EHLO 交换中标识自己,该名称应查找服务器正在使用的 IP。同样,该 IP 的反向查找应返回名称。

  2. 确保您的服务器实际上在该握手中发送主机名。您的服务器不应发送 IP 地址。

  3. 确保您的 IP 地址不在任何 DNSRBL(黑名单)中。如果是,请处理它。

  4. 使用更受欢迎的声誉服务检查您的 IP 的声誉(SenderScore 现在是一个很大的服务,但随着时间的推移可能无法保持)。这些服务通常有提高您的声誉的指导方针,但不像 RBL 那样是彻底的“去/不去”。

  5. 不要伪造的标题,不在于头,并且确保你包括消息的最低标题(DateFrom要求,应该有SubjectSenderReply-To,和To/ Cc/ Bcc[如适用])。这是我最大的宠儿之一,我希望收到的有效时事通讯以垃圾邮件结尾,因为它们伪造 Outlook Express 标头、省略日期或类似内容。

(可选)您应该考虑设置 SPF、DKIM 和 DMARC。这些有助于提高可传递性,但不是必需的(大多数电子邮件服务器不需要)。


Dav*_*ett 11

不幸的是,有许多不同的过滤技术,一些主要的邮件提供商不会公布他们使用的内容和/或各种测试/过滤器的权重,因此很难知道如何通过。基本上,垃圾邮件已使 ISP 和用户陷入一种情况,他们有时会使此类合法邮件(尤其是您的时事通讯等批量邮件)难以通过。我不再认为电子邮件曾经是一种可靠的传输方式。

少一点消极,多一点帮助...当您遇到特定客户的特定问题时,程序可能会告诉您一些事情。我并不特别了解 Outlook,因为我自己并没有在任何地方使用它,但是许多邮件过滤器将标头注入邮件以列出使用了哪些过滤器、结果是什么以及赋予该过滤器的权重是多少。因此,如果您查看邮件的完整来源,它们确实已移至垃圾文件夹,您可能会发现有用的线索。例如,基于 SpamAssassin 的过滤器会注入以下形式的标头:

X-Spam-Flag: YES
X-Spam-Score: 13.371
X-Spam-Level: *************
X-Spam-Status: Yes, score=13.371 tagged_above=-10 required=5.4
    tests=[BAYES_99=3.5, FB_GET_MEDS=0.803, RCVD_IN_SORBS_WEB=0.619,
    RCVD_IN_XBL=3.033, RDNS_NONE=0.1, URIBL_AB_SURBL=1.86,
    URIBL_BLACK=1.955, URIBL_JP_SURBL=1.501]
Run Code Online (Sandbox Code Playgroud)

(该示例是从我的垃圾邮件堆中的真正垃圾邮件中提取的)

这并不是确定的,因为贝叶斯过滤和其他涉及用户培训的方法很常见 - 因此,即使客户端的开箱即用配置相同,您的过滤器通过和失败的内容也可能与其他人明显不同。您可能需要考虑其他渠道来发布您的新闻(许多人为此尝试使用社交网络协议,并取得了不同程度的成功)。


Bar*_*rim 9

就像其他人所说的那样,您希望在发送电子邮件时避免“看起来”像垃圾邮件,但由于技术各不相同,因此您不一定能确定什么会使您看起来像垃圾邮件。

您可能需要考虑的一件事是为每份简报向您的客户发送一封纯文本电子邮件,其中实际上包含一个简短的描述/问候语,然后是“单击此处查看我们的最新简报!” 信息; 这样您就可以在网络服务器上托管您的消息,减少电子邮件的大小(并减少邮件服务器上的负载),作为奖励,您可以检查网络服务器上的日志以获取有关客户数量的反馈实际阅读您的消息与删除它们。


Chr*_*s K 7

我的在线业务遇到了订单确认电子邮件成为垃圾邮件或什至无法送达(通过邮件服务器避开)的问题。这些是简单的“这是您的订单摘要”电子邮件,其中包含一个指向我们网站域的链接。我们最终为我的企业购买了几个 Google Apps 帐户。您可以设置其中之一作为您的 SMTP 服务器。让 Google 作为我们的邮件发件人解决了所有这些问题。

至于电子邮件通讯,一定要使用为您处理选择加入/退出的服务。使用服务以外的任何人发送大量邮件可能会让您被禁止。

  • 实际上,如果您的邮件服务器所在的 ISP 被标记为垃圾邮件,那么祝您好运。当时我们在 Rackspace 上。使用谷歌作为 SMTP 有帮助,因为谷歌确保它没有被列入黑名单。 (3认同)

Bas*_*asj 7

避免电子邮件被识别为垃圾邮件和/或未到达收件人的详细解决方案

示例情况:您有一台运行 PHP 网站的服务器example.com,需要发送电子邮件。而且您注意到您的电子邮件并不总是送达。(如果您是店主,这是一个大问题,并且客户在购买后没有收到电子邮件!)。

如果您遵循以下所有步骤,它应该可以解决 99.9% 的问题。(我一开始以为可以只做其中的几个,例如跳过 DKIM,但最后所有这些都需要解决我遇到的所有问题)。

  1. 首先,谁在发送电子邮件?

    当您的 PHP 代码发送电子邮件时,通常使用著名的 PHP 函数mail(...)。但是这个函数在幕后做了什么?让我们运行一个test.php包含<?php echo ini_get('sendmail_path'); ?>. 你会得到例如:/usr/sbin/sendmail -t -i。好消息,现在我们知道哪个程序真正处理电子邮件了!
    现在有一个棘手的信息:名称sendmail可以是各种程序。即使您sendmail在上一步中看到,您也可能安装了sendmailpostfixexim或 qmail 等。让我们做dpkg -S /usr/sbin/sendmail。答案是postfix: /usr/sbin/sendmail,好的,这意味着我们已经postfix安装了

  2. 查看日志文件/var/mail/www-data以了解哪些电子邮件未正确发送,以及原因。这可能对后续步骤有用。

  3. 正如Jeff Atwood 的博客中提到,是时候查看反向 PTR 记录了。(更多细节将在此处添加)。

  4. 在 postfix 配置文件/etc/postfix/main.cf文件中添加以下行:

    inet_protocols=ipv4
    
    Run Code Online (Sandbox Code Playgroud)

    然后用service restart postfix. 为什么?因为当收件人是 gmail 时我遇到了这样的问题:

    我们的系统检测到此消息 550-5.7.1 不符合有关 PTR 记录和 550-5.7.1 身份验证的 IPv6 发送指南。请查看 550-5.7.1 https://support.google.com/mail/?p=ipv6_authentication_error了解更多 550 5.7.1 信息。

    最简单的解决然后切换postfix仅IPv4的,因此此步骤4(可能是不必要的吗?)。

  5. SPF DNS 记录。为了证明您被允许发送电子邮件@example.com,您可以在域的 DNS 记录中添加 SPF 记录example.com。我在某处找到了The DNS record type 99 (SPF) has been deprecated,所以我们改用 TXT 记录。让我们将其添加为 TXT DNS 记录(另请参见注释 1)

    v=spf1 a mx include:_spf.google.com include:sendgrid.net ~all
    
    Run Code Online (Sandbox Code Playgroud)

    为什么包括这些?因为我的服务器不会是唯一一个从@example.com 发送电子邮件的服务器!我使用受信任的 SMTP 提供商Sendgrid将 Gmail 配置为以contact@example.com 的形式发送邮件请参阅此处的屏幕截图)。如果我不添加这些,Gmail 将不允许从.include:@example.com

  6. DKIM数字签名。正如这里提到的,DKIM 的目标是确保邮件内容在传输过程中不被篡改。这是在 Ubuntu 中的安装过程(这里也是有用的指南):

    • apt-get install opendkim opendkim-tools

    • 创建密钥(您也可以使用http://dkimcore.org/tools/生成密钥和相关的 DNS TXT 记录):

      mkdir /etc/opendkim
      cd /etc/opendkim
      opendkim-genkey -t -s mail -d example.com
      
      Run Code Online (Sandbox Code Playgroud)
    • 让我们把它放进去/etc/opendkim.conf

      Syslog                 yes
      Domain                 *
      KeyFile                /etc/opendkim/mail.private
      Selector               mail
      AutoRestart            yes
      Background             yes
      Canonicalization       relaxed/relaxed
      DNSTimeout             5
      Mode                   sv
      SubDomains             no
      
      Run Code Online (Sandbox Code Playgroud)

      这在/etc/default/opendkim

      SOCKET="inet:8891@localhost" # Ubuntu default - listen on loopback on port 8891
      
      Run Code Online (Sandbox Code Playgroud)

      最后在后缀配置文件的末尾添加/etc/postfix/main.cf

      # DKIM
      milter_default_action = accept
      milter_protocol = 2
      smtpd_milters = inet:localhost:8891
      non_smtpd_milters = inet:localhost:8891
      
      Run Code Online (Sandbox Code Playgroud)
    • 现在让我们将公钥(在 中找到/etc/opendkim/mail.txt)添加到您域的 DNS 记录中:

      mail._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=OqYHd...waPaQAX"
      
      Run Code Online (Sandbox Code Playgroud)

      这是我的注册商 Namelynx 的样子:

    • DKIM 的最后一步:使用service restart opendkim ; service restart postfix.

  7. 测试是否一切正常。最简单的方法是通过 PHP 发送一封电子邮件到auth-results@verifier.port25.com(这个非常有用的工具由 Port25 Solutions 提供):

    $emailfrom = "Example <contact@example.com>";
    $headers  = "MIME-Version: 1.0 \n";
    $headers .= "Content-Transfer-Encoding: 8bit \n";
    $headers .= "Content-type: text/plain; charset=utf-8\n";
    $headers .= "Reply-To: " . $emailfrom . "\n";
    $headers .= "From: " . $emailfrom . "\n";
    $headers .= "Bcc: example@gmail.com\n";
    mail("check-auth@verifier.port25.com", "Hello", "Hello!", $headers);
    
    Run Code Online (Sandbox Code Playgroud)

    然后看这个工具的回答,应该是这样的:

    ==========================================================
    Summary of Results
    ==========================================================
    SPF check:          pass
    DKIM check:         pass
    SpamAssassin check: ham
    
    Run Code Online (Sandbox Code Playgroud)

    服务mail-tester.com也很有用。

  8. (可选)尝试 postmaster.google.com。我用过它,但我不记得它是否有帮助。

  9. 如果它仍然不起作用,解决方案可能是将电子邮件外包给专业的解决方案,以避免(不成功的)调试日日夜夜。是一篇关于这个的好文章。引用如下:“从您的应用程序发送电子邮件可能很糟糕。有一半时间,从您自己的服务器发送的邮件只会被转储到收件人的垃圾文件夹中。” 经过数周的调整,我遗憾地发现这是真的。


补充说明:

(1)

-all : Fail: All mail servers not listed in the SPF record are explicitly not authorized to send mail using the sender’s domain.
~all : Soft Fail: All mail servers not listed in the SPF record are not authorized to send mail using the sender’s domain, but the owner of the domain is unwilling to make a strong assertion to that effect.
?all : Neutral: The domain controller cannot or does not want to assert whether or not all mail servers not listed in the SPF record are authorized to send mail using the sender’s domain.
+all : Pass: All mail servers are authorized to send mail on behalf of the sender’s domain.
Run Code Online (Sandbox Code Playgroud)