2011-11-21 81 views
9

当我通过浏览器执行我的电子邮件脚本时,会返回超时致命错误(除非我大幅增加执行时间,那么它将运行正常,而不是我正在寻找的解决方案)。 电子邮件发送到,但它需要永远(平均5分钟)到达(在我的收件箱)!
(考虑到通过命令行它完美的作品我认为,在SMTP php.ini中肯定是配置好。)mail()超时问题

因此,这是由浏览器请求执行的代码:

<?php 
mail('[email protected]', 'test subject', 'test body', 'From: Andre Matos <[email protected]>'); 
?> 

,当我运行此相同的(?是不是真的一样,我开始怀疑自己)通过命令行代码:

php -r "mail('[email protected]', 'test subject', 'test body', 'From: Andre Matos <[email protected]>');" 

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

那么,什么会导致这种差异,以及如何解决它呢?有任何想法吗?
在此先感谢。


[编辑]一些额外的信息:
- 机器是windows
- 服务器为localhost
- php.ini文件是浏览器和CLI实例都相同


[编辑]
谢谢大家试图猜测哪个是问题。我提出了问题跳出来,以前有人遇到过这个问题,并且知道具体的事情。鉴于没有具体的东西出现,没有任何的建议真的起作用,我决定接受让我得出更多关于这个问题的结论的东西...... +1对于你所有有用的知识/想法(/猜测):-)

+2

命令行和浏览器实际上使用了两个不同的php.ini文件。你可能想搜索php.ini并比较你的设置 – Patrick

+1

这对我来说毫无意义;所以我检查:'php --ini'返回与浏览器相同的配置文件路径。 – acm

+0

我假设sendmail_path也一样吗? – djdy

回答

5

我假设的一些couses,但我用Linux和Windows上,我可以olny猜测:

  1. php_cli和mod_php的2个不同的二进制文件,mod_php,并且可以稍微受损
  2. php_cli和mod_php的使用2个不同的用户,apache用户的网络配置文件可能是问题(DNS,防火墙,代理...)
  3. 您的PHP脚本是在“有问题”的位置或包含一些有问题的角色,但您的CLI脚本是由param,尝试执行相同的脚本:php -fz:\ path \ to \ php \ mail.php
+0

嗨,我试图通过CLI执行文件,如你所述,它按预期工作,即时交付;所以问题不应该是脚本文件。 – acm

+0

@andrematos验证.1你可以重新安装mod_php并验证.2你可以从apache/html_page系统(“php -fz:\ path \ to \ php \ mail.php”) –

+0

嗨Ivan,我测试过.2并惊讶地发现它和直接从浏览器执行mail()一样多。那么是否有可能使用不同的用户?我的意思是,它的安装方式都是一样的,同时......仍然没有道理......谢谢。 – acm

2

只是要清楚:脚本使用的php-instance与命令行代码使用的php-instance是一样的吗?

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

+0

我从我的机器上运行这个,所以是的,它是一样的。 – acm

3

鉴于此便条http://php.net/manual/en/function.mail.php,它似乎很可能,这个问题与MTA,而不是直接PHP:

Windows实现邮件的()不同,从UNIX实现多种方式。首先,它不使用本地二进制来编写消息,而只使用直接套接字,这意味着需要在网络套接字(可以在本地主机或远程机器上)上监听MTA。

也许它与MTA对特定用户的响应方式或用户特定的防火墙规则有关,用于机器上的传出邮件连接。你可以运行命令行作为web服务器用户而不是你自己吗?如果是这样,是否会从命令行重新创建问题?

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

(对不起,这些是不是明确的答案更多的猜测。)

+0

特罗特,谢谢你的努力,但正如我向塞卡解释的(见评论),我不认为我正在通过MTA。我可能有错误的想法tho .. – acm

+0

@andrematos MTA是处理邮件传输的通用术语。无论如何,我仍然会检查涉及用户和防火墙规则的潜在问题。 – Trott

2

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

你试过PHP mailer

在我看来,它在几秒钟内发送邮件。下面的例子会让你快速浏览一下如何使用php邮件类。

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

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

Windows实现邮件()从UNIX实现许多方面有所不同。首先,它不使用本地二进制来编写消息,而只使用直接套接字,这意味着需要在网络套接字(可以在本地主机或远程机器上)上监听MTA。

这样可能会导致延迟?我认为这link可能会帮助你。

+0

我尝试了PHPMailer和[Swift](http://swiftmailer.org/),其行为完全相同。 – acm

+0

@andrematos检查我的答案编辑部分 – VKGS

+0

Sekar,我连接到目标SMTP。我的设置是这样的:SMTP:mail.example.com; FROM:[email protected]; TO:[email protected];所以我认为MTA在这里没有任何作用。 – acm

2

发送之前在剧本邮件请务必打印出变量SMTPsmtp_portini_get(),并sendmail_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: [email protected] 
250 2.1.0 Ok 
rcpt to: [email protected] 
250 2.1.5 Ok 
data 
354 End data with <CR><LF>.<CR><LF> 
from: [email protected] 
to: [email protected] 
subject: test mail 

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

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

要确认这个想法,您可以制作一个循环发送10封邮件,并在第一个邮件更快后检查邮件。