Php 邮件()超时问题
当我通过浏览器执行电子邮件脚本时,返回一个超时致命错误(除非我大幅增加执行时间,否则它将正常运行,而不是我正在寻找的解决方案)电子邮件是通过发送的,但它需要永远(平均5分钟)才能到达(我的收件箱)Php 邮件()超时问题,php,email,browser,command-line-interface,Php,Email,Browser,Command Line Interface,当我通过浏览器执行电子邮件脚本时,返回一个超时致命错误(除非我大幅增加执行时间,否则它将正常运行,而不是我正在寻找的解决方案)电子邮件是通过发送的,但它需要永远(平均5分钟)才能到达(我的收件箱) (考虑到通过命令行它可以完美地工作,我认为php.ini上的SMTP肯定配置良好。) 这是浏览器请求执行的代码: <?php mail('amatos@example.com', 'test subject', 'test body', 'From: Andre Matos <amatos
(考虑到通过命令行它可以完美地工作,我认为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>');"
php-r“邮件”amatos@example.com“,”测试对象“,”测试机构“,”发件人:Andre Matos“;”
它工作得很好!脚本运行,它停止,电子邮件立即到达(2/3秒)
那么,是什么导致了这种差异以及如何解决它呢?有什么想法吗?提前谢谢
[编辑]一些额外信息:
-这台机器是windows
-服务器是本地主机
-php.ini对于浏览器和cli实例都是相同的
[edit2]
谢谢大家试着猜出问题出在哪里。我提出了这样一个问题:有人以前有过这个问题,并且知道一些具体的事情。考虑到没有任何具体的建议出现,也没有任何建议真正起作用,我决定接受让我对这个问题得出更多结论的建议+1对于您所有有用的知识/想法(/猜测):-)请澄清:脚本使用的php实例与命令行代码使用的实例相同
许多web主机使用smtp中继,它将收集一堆电子邮件并同时发送所有邮件,因此,如果您的邮件迟到,这不会是一种奇怪的行为。但是,执行时间长是不正常的。我假设了一些原因,但我习惯于linux和windows,我猜:
(很抱歉,这些都是猜测而不是明确的答案。)尝试将用户名和密码设置为“发件人”邮件id。这样它就可以进行身份验证并快速发送邮件 你试过了吗 据我观察,它在几秒钟内就能发送邮件。下面的示例将让您快速了解如何使用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监听网络套接字(可以在本地主机或远程计算机上)
那么这可能会导致延误?我认为这可能会对您有所帮助。在脚本中发送邮件之前,请确保打印出变量
SMTP
、SMTP\u port
和sendmail\u from
的ini\u 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
c:\>telnet smtp.domain.com 25
220 smtp.domain.com ESMTP后缀
海洛邮件测试
250 smtp.domain.com
邮寄地址:user@local.com
250 2.1.0正常
rcpt至:user@remote.com
250 2.1.5正常
数据
354使用结束数据。
发件人:user@local.com
致:user@remote.com
主题:测试邮件
这是一条测试消息
.
250 2.0.0正常:作为42AD8364FE0E排队
退出
221 2.0.0再见
我的第一个猜测是,您邮件的浏览器版本已经为发送做好了上下文或连接准备。
相反,直接(php-r)执行必须加载邮件上下文
为了证实这个想法,你可以循环发送10封邮件,然后检查第一封邮件之后的邮件是否会更快 命令行和浏览器实际上使用两个不同的php.ini文件。您可能想搜索php.ini并比较您的设置,这对我来说毫无意义;所以我检查:
php--ini
返回与浏览器相同的配置文件路径。我假设sendmail_路径也相同?您是否尝试过在上找到的“dave dot kelly at dawkco.com”的示例?对PHP_EOL的引用可以是您的解决方案。djdy,是的,sendmail_路径是相同的。Ivan Buttinoni,它不工作,有相同的行为。我在我的机器上运行这个,所以是的,它是相同的。我尝试了PHPMailer和,行为完全相同。Sekar,我正在连接到目标SMTP。我的设置类似于:SMTP:mail.example.com;发件人:amatos@example.com