mail()超时问题

时间:2011-11-21 18:12:37

标签: php email browser command-line-interface

当我通过浏览器执行我的电子邮件脚本时,会返回超时致命错误(除非我大幅增加执行时间,否则它将运行正常,而不是我正在寻找的解决方案)。 电子邮件发送,但需要永久(平均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秒)。

那么,是什么导致这种差异以及如何解决它?任何想法?
提前谢谢。


[编辑]一些额外的信息:
   - 机器是窗户    - 服务器是localhost
   - php.ini对于浏览器和cli实例都是相同的


[EDIT2]
谢谢大家试图猜出哪个是问题所在。我之前提出的问题是,有人遇到过这个问题并知道具体的问题。鉴于没有任何具体的信息显示,并且没有任何建议确实奏效,我决定接受允许我就问题得出更多结论的那个...... +1对于你所有有用的知识/想法(/猜测):-)

6 个答案:

答案 0 :(得分:5)

我已经假设了一些问题,但我习惯使用linux和Windows,我可以猜测:

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

答案 1 :(得分:3)

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

  

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

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

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

(对不起,这些比猜测答案更有猜测。)

答案 2 :(得分:2)

请注意:脚本使用的php实例与命令行代码使用的实例相同?

许多网络主机使用smtp-relay,它会收集大量电子邮件并一次性发送,所以如果你的邮件迟到,这种行为并不奇怪。但是,执行时间长是不正常的。

答案 3 :(得分:2)

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

你试过PHP mailer吗?

在我的观察中,它会在几秒钟内发送邮件。下面的例子将让你快速了解如何使用php邮件程序类。

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。

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

答案 4 :(得分:2)

在您通过脚本发送邮件之前,请确保打印ini_get()变量SMTPsmtp_portsendmail_from,并确保这些变量正常工作值。在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 :(得分:2)

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

为了确认这个想法,你可以制作一个发送10封邮件的循环,并在第一封邮件快得多之后检查邮件。