发送电子邮件对一些域名来说很慢

我的系统使用sendmail从php发送电子邮件。 我意识到有关堆栈交换关于从sendmail / php发送电子邮件的延迟有几十个问题。 我已经读了所有,但我仍然无法解决我的问题。

我有一个生产服务器和一个开发服务器。 生产位于数据中心,使用“智能主机”转发电子邮件,直接发送电子邮件被防火墙阻止。 发展在我们的办公室,并直接发送电子邮件。 他们也使用不同的DNS服务器。 除此之外,这些服务器与我所能做到的相似。 我的系统需要一次发送很多(大约一万个)电子邮件。 我的开发服务器能够在一小时之内发送所有邮件。 生产系统需要24小时以上。 电子邮件大小为2kb-5kb。

在我的生产服务器上:

我已经确定,从PHP到sendmail的交接速度很快。 Sendmail发送电子邮件到某些域缓慢。 大邮件服务(gmail,aol,yahoo)速度很快。 我试图发送1000封电子邮件给只有一个地址,他们都在几分钟内发送,所以我知道这个中继能够快速发送邮件。 我的问题是,我的地址列表中的大部分电子邮件地址是小的域名,其中大部分是缓慢的。 这导致我相信缓慢的步骤涉及DNS。 这里是我的maillog文件摘录({大括号中的值取代隐私)。

Mar 28 11:21:47 {servernamereplaced} sendmail[26242]: v2SILe8w026242: to={[email protected]}, ctladdr={[email protected]} (48/48), delay=00:00:07, xdelay=00:00:00, mailer=relay, pri=32561, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v2SILlIu026244 Message accepted for delivery) Mar 28 11:22:08 {servernamereplaced} sendmail[26247]: v2SILmT8026247: to={[email protected]}, ctladdr={[email protected]} (48/48), delay=00:00:20, xdelay=00:00:10, mailer=relay, pri=32550, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (v2SILwOh026248 Message accepted for delivery). 

你可以看到这些有很长的延迟。 但是,当我运行host -t mx domain1replaced.net我得到的结果非常快(不到半秒,正好与gmail.com或aol.com一样长)。

我已经看到了一些答案,提到sendmail.cf中的超时值,但我不知道有足够的关于我自己的文件。 而且,延迟值不是全部相同或是相同数字的倍数。 他们似乎相当分散在5到30秒之间。 得到我的是我的开发服务器发送它们这么快,但我不能让我的生产服务器做同样的事情。 我能做些什么来加快我的生产服务器?

如果您发送另一封电子邮件至以前速度较慢的地址,那么我将假设这是第二次。 如果是这样的话,我会尝试在邮件服务器上使用telnet连接到远程邮件服务器,并以这种方式发送testing邮件。 我已经用这种方法淘汰了一些延迟相关的问题。 它有时可以帮助确定通信过程中的哪一步正在进行。

使用telnet邮件的体面的写法:

https://weblogs.asp.net/owscott/Troubleshooting-email_2C00_-the-Telnet-way

这个问题可能不在本地进行DNS查询,而是远程结束。 当您的SMTP服务器A发送到SMTP服务器B时,服务器B将(可能)对IP地址执行PTR查询,然后对返回的名称进行转发查询以确保它们匹配。 如果这些DNS查询中的任何一个很慢,它可能会解释您的观察。

让我们开始分析sendmail的日志,尤其是delayxdelay 。 从这里:

延迟:总消息延迟:接收和最终交付之间的时间差或反弹)。 格式为delay = HH:MM :: SS,延迟时间less于一天,delay = days + HH:MM :: SS,否则

xdelay:邮件在最终传送期间传送的总时间。 这与delay = equate不同,因为xdelay = equate只计算实际最终交付的时间。

为了更好地强调delay / xdelay(取自这里 )之间的区别:

这与delay =的不同之处在于delay =显示消息从消息最初被接收或排队(这可能是几天前)开始计算的总时间,直到它最终被传送。 在SMTP邮件的情况下, 当sendmail开始尝试连接到远程主机时xdelay =计算开始。

您的日志显示以下延迟/ xdelay:

delay=00:00:07, xdelay=00:00:00 :这个消息在sendmail的队列中等待了7秒, 甚至在smtp传输被处理之前 。 这是一个超载服务器的标志,而不是连接/ DNS的问题:毕竟,实际的交通几乎立即执行;

delay=00:00:20, xdelay=00:00:10 :这一次,sendmail队列中的消息停留10秒,实际传输工具又10秒。 根据您的服务器的声誉,这可以是一个非常合理的价值:许多邮件服务器延迟HELO / EHLO 5-30秒,不知道中立的发件人。

那么,为什么testing机器比你的生产机器要快得多呢? 这里有一些可能性:

  • 通过智能主机发送比直接发送电子邮件更简单快捷。 当从你的开发者服务器发送,你确定电子邮件实际上是在大约一小时内收到 ,或者这只是你的开发服务器把所有的邮件传递给智能主机的时间?
  • 也许你的智能主机有良好的声誉,远程服务器不需要人为地等待,
  • 发送很多电子邮件是一个非常fsync()密集的工作。 您的开发人员和生产服务器是否真的一样,硬件和软件都是一样的? 智能主机的硬件和软件堆栈呢?

发送电子邮件到100个域总是比单个域的100个用户发送电子邮件慢(由于连接重用)(postfixlogging所使用的连接数量)每个域的IP变暖和优化发送速率涉及大量工作。 如果将tls添加到组合中,则每个电子邮件都会build立一个连接(tcp + tls构build和收件人速率限制),也会丢失连接重用选项。

如果您没有或不想花时间build立声誉和调整率限制,则应评估第三方选项。