【问题标题】:20 Sec Delay when sending email through mail() Apache+PHP5.3+sendmail?通过mail()Apache + PHP5.3 + sendmail发送电子邮件时延迟20秒?
【发布时间】:2013-04-02 23:25:48
【问题描述】:

今天我发现我的网站联系表大约需要 20 秒才能在我的 Godaddy Centos VPS 服务器中发送一封电子邮件。

我调查了这个问题,发现源是PHPmail()函数引起的。当我在我网站的联系页面上输入消息并单击发送按钮时,页面加载完成大约需要 20 秒。

使用以下 PHP 代码创建一个 test.php 文件来测试邮件:

<?php

mail("myemail@mydomain.com", "Test", "Test");

?>

我在服务器上运行了命令:php test.php。

我检查了/var/log/maillog,发现电子邮件已立即发送,没有任何延迟。

20 秒延迟仅发生在我通过网站执行代码时。我认为这与 Apache 用户有关,因为带有 root 用户的命令行可以毫无延迟地发送电子邮件。

这是我使用 root 用户通过控制台发送电子邮件时的邮件日志:

Apr 10 14:57:04 ip-103-1-173-250 sendmail[27681]: r3ALv4i3027681: from=root, size=174, class=0, nrcpts=1, msgid=<201304102157.r3ALv4i3027681@ip-103-1-173-250.ip.secureserver.net>, relay=root@localhost
Apr 10 14:57:05 ip-103-1-173-250 sendmail[27681]: r3ALv4i3027681: to=john23157@gmail.com, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30174, relay=myserver, dsn=2.0.0, stat=Sent (Accepted message qp 20459 bytes 684)

出于安全原因,我在这篇文章中将relay= 值替换为myserver。

从上面的邮件日志可以看出,邮件是即时发送的,我确实收到了邮件。

这是我通过网站联系表发送邮件时的邮件日志:

Apr 10 14:54:22 myhostname sendmail[27655]: r3ALsMjV027655: from=support@mydomain.com, size=940, class=0, nrcpts=1, msgid=<d946feca6d6640910e2db02d541aa704@mydomain.com>, relay=apache@localhost

Apr 10 14:57:56 myhostname sendmail[27655]: r3ALsMjV027655: to=john23157@gmail.com, ctladdr=support@mydomain.com (48/48), delay=00:03:34, xdelay=00:03:34, mailer=relay, pri=30940, relay=myserver, dsn=2.0.0, stat=Sent (Accepted message qp 21186 bytes 1297)

上面的maillog显示延迟了3分半钟。

我不知道是什么导致了通过 Apache 发送时的延迟。

您的帮助将不胜感激。

谢谢

【问题讨论】:

  • 这种延迟大多是由网络问题引起的
  • 您能以 apache 用户身份以详细模式发送测试消息吗? (echo subject: test; echo to: xxx@gmail.com; echo from: support@mydomain.com ; echo ; echo test) | /usr/sbin/sendmail -i -t -v -fsupport@mydomain.com 通过定位延迟交付阶段可能有助于缩小可能性。

标签: php apache email centos sendmail


【解决方案1】:

我在专家交流中找到了这个解决方案,它为我解决了这个确切的问题。

--- 粘贴在下面---

我的问题是 Sendmail 会查找完全限定的域 (FQDN) 名称,而我的主机文件中没有该名称。一旦我从这里改变它:

127.0.0.1 本地主机

127.0.1.1 网络服务器

到这里:

127.0.0.1 localhost localhost.localdomain 网络服务器

【讨论】:

    【解决方案2】:

    我敢打赌,这不是 PHP 的 mail() 函数造成的。

    mail() 函数是对调用 MTA 的 CLI 接口的 exec 调用的简单包装。简单地执行一个程序不太可能有这样的延迟 - 每次我遇到这个问题时,它都是 MTA 尝试同步卸载消息并在此过程中遇到问题的结果(配置错误的 DNS,缺少智能主机, ident 查找....)。

    由于它是 VPS,因此您可以控制 MTA 的(错误)配置方式。这是 ServerFault 的主题,而不是 Stackoverflow。

    (顺便说一句,您是否检查过 CLI 和网络服务器 SAPI 的配置是否相同?您是否尝试从网络服务器 sapi 执行 CLI?)

    【讨论】:

      【解决方案3】:

      正如@hek2mgl 所说,不幸的是,大多数此类事情都是由网络问题引起的——链中的一个邮件服务器可能不堪重负,或者此时网络的某些部分可能很慢。当我开发自己的 PHP 应用程序时,我遇到了类似的问题。

      由于您有自己的 VPS,我建议您安装自己的 SMTP 服务器。我用了PostFix,但还有其他的。然后配置它以替换内置的 unix sendmail 命令。你可以找到instructions on how to install postfix at the CentOS Wiki

      如果设置正确,从 PHP 调用 mail() 会将邮件添加到 Postfix 的发送队列中,而不是尝试联系外部邮件服务器。它会立即返回(这意味着您的应用会感觉更快),而 Postfix 会在需要时继续尝试在后台发送电子邮件。

      【讨论】:

      • -1:如果 user2205533 尚未安装 MTA,则 mail() 将立即返回(有错误)。
      • 感谢大家的帮助,我现在安装 PostFix 只是为了发送邮件但无法接收,因为我的邮件服务器与我的网站不在同一台服务器上。现在电子邮件现在立即发送。非常感谢。
      猜你喜欢
      • 2010-11-28
      • 2015-10-27
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2015-07-19
      • 2012-12-11
      • 2012-07-24
      • 2018-10-24
      相关资源
      最近更新 更多