如何发送电子邮件并避免将其分类为垃圾邮件?


82

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

有时我想向客户发送新闻通讯。问题是,某些电子邮件被作为垃圾邮件捕获。大多数情况下是通过Outlook在客户端(甚至在我自己的Outlook 2007中)。

现在,我想知道如何创建“好”电子邮件。我知道反向查询等,但是,例如,具有唯一ID的退订链接怎么办?这会增加垃圾邮件等级吗?


Answers:


82

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

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

使用SPF域密钥之类的电子邮件身份验证方法来证明您的电子邮件和域名属于同一个人。不错的副作用是,您可以帮助防止电子邮件域被欺骗。还要检查您的反向DNS,以确保您的邮件服务器的IP地址指向您用于发送邮件的域名。

确保电子邮件的回复地址是有效的现有地址。在“收件人”字段中使用收件人的全名,而不只是电子邮件地址(例如"John Doe" <john.doe@example.com>),并监视您的滥用帐户,例如abuse@example.compostmaster@example.com


并使用仅包含文本的html电子邮件的分段/替代版本。这意味着垃圾邮件扫描程序在分类时将有更多有用的东西要经过。
马特(Matt)

22

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


4
这很有趣。我对这些反馈回路一无所知。所有提供商都提供这样的程序吗?
kcode

1
并非所有提供商,都不是。但是大多数主要公司,包括Yahoo和AOL等。我知道,所有投诉反馈循环都要求消息是通过DKIM或DomainKeys进行身份验证的域发送的。我相信有些人也需要SPF,但这种情况很少见。

15

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

这些天最低要求是这些天:

  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。这些有助于交付,但不是必需的(不是绝大多数的电子邮件服务器)。


11

不幸的是,有许多不同的过滤技术,并且一些主要的邮件提供商不会发布它们使用的内容和/或对各种测试/过滤器赋予的权重,因此知道如何通过是很困难的。基本上,垃圾邮件已将ISP和用户带入一种情况,有时它们使此类合法消息(尤其是批量消息,如新闻稿)难以通过。我不再认为电子邮件是过去曾经是中途可靠的传输方法。

减少负面影响,提供更多帮助...当您遇到特定客户的特定问题时,程序可能会告诉您一些信息。我不特别了解Outlook,因为我自己不在任何地方使用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]

(该示例已从我的垃圾堆中真正的垃圾邮件消息中剔除)

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


9

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

您可能要考虑的一件事是,向每封新闻简讯发送给您的客户纯文本电子邮件,其中实际上包含一个简短的说明/问候,然后是“单击此处以查看我们的最新简讯!” 信息; 这样,您可以将邮件托管在Web服务器上,减少了电子邮件的大小(并减少了邮件服务器的负载),此外,您还可以检查Web服务器上的日志以获取有关多少客户的反馈信息实际阅读您的邮件还是删除邮件。


嗯 在此之前,我从未见过垃圾邮件发送者使用这种策略……
厄尼

通常,带有合法链接或两个链接的纯文本(通常不会大量散布)往往会通过...否则,如果没有链接被标记为垃圾邮件,我将无法通过电子邮件将链接发送给自己或其他人。这就像说您从未见过垃圾邮件发送者发送带有“脏话”的即时消息来诱使人们做出响应。合法流量也可以。关键是不要太“垃圾邮件” ...像bevans这样的用户名可能不会像“ hottienakedchick69”那样可疑,即使内容相同,您知道我的意思吗?
巴特·西尔弗斯特姆2009年

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. 在后缀配置文件中添加以下行/etc/postfix/main.cf

    inet_protocols=ipv4
    

    然后使用重新启动postfix 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
    

    为什么包括这些?因为我的服务器将不是唯一一个从@ 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
      
    • 让我们把它放在/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
      

      /etc/default/opendkim

      SOCKET="inet:8891@localhost" # Ubuntu default - listen on loopback on port 8891
      

      最后将其添加到postfix配置文件的末尾/etc/postfix/main.cf

      # DKIM
      milter_default_action = accept
      milter_protocol = 2
      smtpd_milters = inet:localhost:8891
      non_smtpd_milters = inet:localhost:8891
      
    • 现在,将公共密钥(位于中/etc/opendkim/mail.txt)添加到您域的DNS记录中:

      mail._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=OqYHd...waPaQAX"
      

      这是我的注册商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);
    

    然后查看此工具的答案,它应如下所示:

    ==========================================================
    Summary of Results
    ==========================================================
    SPF check:          pass
    DKIM check:         pass
    SpamAssassin check: ham
    

    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.

6

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

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


这是一种解决方法。正确的解决方案是纠正有故障的系统,并确保您至少在DNS中具有正确的SPF记录。
John Gardeniers 2012年

3
实际上,如果您的邮件服务器所在的ISP被标记为垃圾邮件,那就祝您好运。当时我们在Rackspace上。由于Google确保未将其列入黑名单,因此将Google用作SMTP很有帮助。
克里斯K

2

有一个新指南已发布在电子邮件收件箱中

我见过最全面的。43个不同点的清单,涵盖了如何避免被标记为垃圾邮件的每个水龙头。不断更新。

从设置DNS,配置身份验证,设置信誉监控,降低跳出率,测试电子邮件内容等。

ZeroBounce.NET全面覆盖所有内容

https://www.zerobounce.net/guide-to-improve-inbox-and-delivery.html


目前,此帖子实质上只是一个链接。为了确保即使链接断开,答案仍然有用,请对其进行编辑以包括相关信息。
ANX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.