【问题标题】:mail() timeout issue邮件()超时问题
【发布时间】:2012-01-03 05:23:36
【问题描述】:

当我通过浏览器执行我的电子邮件脚本时,会返回一个超时致命错误(除非我大幅增加执行时间,否则它会运行正常,而不是我正在寻找的解决方案)。 电子邮件已发送,但需要很长时间(平均 5 分钟)才能到达(我的收件箱)!
(考虑到通过命令行它可以完美运行,我认为 php.ini 的 SMTP 肯定配置得很好。)

这是浏览器请求执行的代码:

<?php
mail('amatos@example.com', 'test subject', 'test body', 'From: Andre Matos <amatos@example.com>');
?>

当我通过命令行运行同样的代码时(真的一样吗?我开始怀疑自己了):

php -r "mail('amatos@example.com', 'test subject', 'test body', 'From: Andre Matos <amatos@example.com>');"

完美运行!脚本运行,它停止并且电子邮件立即到达(2/3 秒)。

那么,什么会导致这种差异以及如何解决呢?有什么想法吗?
提前致谢。


[编辑] 一些额外信息:
- 机器是windows
- 服务器是本地主机
- php.ini 对于浏览器和 cli 实例都是一样的


[编辑2]
感谢大家尝试猜测问题所在。我提出了一个问题,即有人以前遇到过问题并且知道一些具体的事情。鉴于没有出现任何具体的建议并且没有任何建议真正奏效,我决定接受那个让我对这个问题得出更多结论的建议...... +1 对于你所有有用的知识/想法(/猜测):-)

【问题讨论】:

  • 命令行和浏览器实际上使用的是两个不同的php.ini文件。您可能需要搜索 php.ini 并比较您的设置
  • 这对我来说毫无意义;于是查了一下:php --ini返回的配置文件路径和浏览器一样。
  • 我假设 sendmail_path 也是一样的?
  • 你试过it.php.net/manual/en/function.mail.php上的“dave dot kelly at dawkco dot com”的例子吗?对 PHP_EOL 的引用可以成为您的解决方案。
  • djdy,是的,sendmail_path 是一样的。 Ivan Buttinoni,它不起作用,具有相同的行为。

标签: php email browser command-line-interface


【解决方案1】:

我假设了一些原因,但我曾经使用过 linux 和 windows 我可以猜测:

  1. php_cli 和 mod_php 是 2 个不同的二进制文件,mod_php 可能会受到轻微损坏
  2. php_cli 和 mod_php 使用 2 个不同的用户,apache 用户的网络配置文件可能是问题(dns、防火墙、代理...)
  3. 您的 php 脚本位于“有问题”的位置或包含一些有问题的字符,但您的 cli 脚本是由参数控制的,请尝试执行相同的脚本:php -f z:\path\to\php\mail.php

【讨论】:

  • 嗨,我尝试按照您的说法通过 CLI 执行文件,它按预期工作,即时交付;所以问题不应该是脚本文件。
  • @andrematos 验证 .1 您可以重新安装 mod_php 并验证 .2 您可以从 apache/html_page 系统(“php -fz:\path\to\php\mail.php”)
  • 嗨,Ivan,我测试了 .2,惊讶地发现它与直接从浏览器执行 mail() 一样多。那么有可能使用不同的用户吗?我的意思是,它们都以相同的方式同时安装...仍然没有意义...无论如何谢谢。
【解决方案2】:

鉴于来自http://php.net/manual/en/function.mail.php 的注释,问题似乎很可能是 MTA 而不是 PHP:

mail() 的 Windows 实现在许多方面与 Unix 实现不同。首先,它不使用本地二进制文件来编写消息,而仅在直接套接字上运行,这意味着需要 MTA 侦听网络套接字(可以在 localhost 或远程计算机上)。

这可能与 MTA 响应特定用户的方式有关,或者与您机器上的外发邮件连接的用户特定防火墙规则有关。您可以以 Web 服务器用户而不是您自己的身份运行命令行吗?如果是这样,这是否会从命令行重新产生问题?

让网络服务器执行命令行 PHP 而不是解析的 PHP 文件怎么样? (例如,也许您可​​以通过 CGI 运行批处理脚本。)这是否解决了问题?

(很抱歉,这些猜测多于确定的答案。)

【讨论】:

  • Trott,感谢您的努力,但是正如我向 Sekar 解释的那样(参见 cmets),我认为我不会通过 MTA。我可能有错误的想法。..
  • @andrematos MTA 是处理邮件传输的通用术语。无论如何,我仍然会检查是否存在涉及用户和防火墙规则的潜在问题。
【解决方案3】:

要明确一点:脚本使用的 php-instance 与命令行代码使用的 php-instance 相同吗?

许多网络主机使用 smtp-relay,它会收集一堆电子邮件并一次发送它们,因此如果您的邮件迟到了,这不会是奇怪的行为。但是执行时间长是不正常的。

【讨论】:

  • 我在我的机器上运行它,所以是的,它是一样的。
【解决方案4】:

在脚本中发送邮件之前,请确保打印出变量SMTPsmtp_portsendmail_fromini_get(),并确保这些是工作值。在 Windows 上运行的 PHP 没有通过 Sendmail 发送邮件的好处,而且 PHP 开发人员拼凑起来的东西充其量只是粗略的。

我总是喜欢通过 telnet 测试邮件,这样我可以查看服务器是否给出了客户端没有正确传回的错误:

c:\> telnet smtp.domain.com 25

220 smtp.domain.com ESMTP Postfix
helo mailtest
250 smtp.domain.com
mail from: user@local.com
250 2.1.0 Ok
rcpt to: user@remote.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
from: user@local.com
to: user@remote.com
subject: test mail

this is a test message
.
250 2.0.0 Ok: queued as 42AD8364FE0E
quit
221 2.0.0 Bye

【讨论】:

    【解决方案5】:

    尝试将用户名和密码设置为“发件人”邮件 ID。因此它可以快速验证并发送邮件。

    你试过PHP mailer吗?

    据我观察,它会在几秒钟内发送邮件。下面的示例将让您快速了解如何使用 php mailer 类。

    include  "class.phpmailer.php";
    $msg="Hello! This is a test..."
    $mail=new PHPMailer();
    $email="someone@friend.com"; //person who receives your mail
    $mail->IsSMTP();
    $mail->Host = "localhost";
    $mail->SMTPAuth = true; 
    $mail->Username = "admin@example.com"; //your mail id
    $mail->Password = "sdfsd441"; //password for your mail id
    $mail->SetFrom('admin@example.com', 'admin'); //from address
    $mail->AddAddress($email);
    $mail->Subject ="Test Mail";
    $mail->Body = $msg;
    $mail->IsHTML(true);
    $mail->MsgHTML($msg);
    $mail->Send();  
    

    编辑:
    在 PHP 手册中,他们这样说,

    mail() 的 Windows 实现在许多方面与 Unix 实现不同。首先,它不使用本地二进制文件来编写消息,而仅在直接套接字上运行,这意味着需要 MTA 侦听网络套接字(可以在 localhost 或远程计算机上)。

    这样可能会导致延迟?我认为link 可能会对您有所帮助。

    【讨论】:

    • 我尝试了 PHPMailer 和 Swift 并且行为完全一样。
    • Sekar,我正在连接到目标 SMTP。我的设置类似于: SMTP:mail.example.com;发件人:amatos@example.com;收件人:amatos@example.com;所以我认为 MTA 在这里没有任何作用。
    【解决方案6】:

    我的第一个猜测是您的邮件的浏览器版本已经准备好发送的上下文或连接。 相反,直接 (php -r) 执行必须加载邮件上下文。

    为了确认这个想法,您可以循环发送 10 封邮件,并检查第一次之后的邮件是否更快。

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 2022-11-22
      • 2018-03-11
      • 2014-03-08
      • 2015-01-24
      • 2010-12-29
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多