Mail()超时问题


mail() timeout issue

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

那么,是什么导致了这种差异以及如何解决它呢?什么好主意吗?
提前谢谢。


[edit] some extra info:
-机器是windows
-服务器是localhost
- php.ini对于浏览器和cli实例是相同的


[edit2]
谢谢大家试着去猜问题出在哪里。我提出了这样的问题:有人以前遇到过这个问题,并且知道一些具体的事情。鉴于没有什么具体的建议出现,而且没有一个建议真正起作用,我决定接受那个能让我对这个问题得出更多结论的建议。+1感谢您的知识/想法(/猜测):-)

我假设了一些过程,但我习惯linux和windows,我只能猜测:

  1. php_cli和mod_php是两个不同的二进制文件,mod_php可以稍微损坏
  2. php_cli和mod_php使用2个不同的用户,apache用户的网络配置文件可能是问题(dns,防火墙,代理…)
  3. 你的php脚本是在"有问题"的位置或包含一些有问题的字符,但你的cli脚本是通过参数,尝试执行相同的脚本:php -f z:'path'to'php'mail.php

考虑到这个来自http://php.net/manual/en/function.mail.php的说明,似乎很可能问题是与MTA有关,而不是直接与PHP有关:

mail()的Windows实现在许多方面与Unix实现不同。首先,它不使用本地二进制来组合消息,而只在直接套接字上操作,这意味着MTA需要侦听网络套接字(可以在本地主机上,也可以在远程机器上)。

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

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

(很抱歉这些都是猜测而不是明确的答案)

只是为了清楚:脚本使用的php-instance与命令行代码使用的php-instance相同?

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

在脚本中发送邮件之前,请确保打印出变量SMTP, smtp_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

尝试将用户名和密码设置为"From"邮件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需要侦听网络套接字(可以在本地主机上,也可以在远程机器上)。

这样会造成延误吗?我想这个链接可能对你有帮助。

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

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