Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 邮件()超时问题_Php_Email_Browser_Command Line Interface - Fatal编程技术网

Php 邮件()超时问题

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

当我通过浏览器执行电子邮件脚本时,返回一个超时致命错误(除非我大幅增加执行时间,否则它将正常运行,而不是我正在寻找的解决方案)电子邮件是通过发送的,但它需要永远(平均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>');"
php-r“邮件”amatos@example.com“,”测试对象“,”测试机构“,”发件人:Andre Matos“;”
它工作得很好!脚本运行,它停止,电子邮件立即到达(2/3秒)

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


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


[edit2]

谢谢大家试着猜出问题出在哪里。我提出了这样一个问题:有人以前有过这个问题,并且知道一些具体的事情。考虑到没有任何具体的建议出现,也没有任何建议真正起作用,我决定接受让我对这个问题得出更多结论的建议+1对于您所有有用的知识/想法(/猜测):-)

请澄清:脚本使用的php实例与命令行代码使用的实例相同


许多web主机使用smtp中继,它将收集一堆电子邮件并同时发送所有邮件,因此,如果您的邮件迟到,这不会是一种奇怪的行为。但是,执行时间长是不正常的。

我假设了一些原因,但我习惯于linux和windows,我猜:

  • php_cli和mod_php是两个不同的二进制文件,mod_php可能会受到轻微损坏
  • php_cli和mod_php使用2个不同的用户,apache用户的网络配置文件可能是问题所在(dns、防火墙、代理…)
  • 您的php脚本位于“有问题”的位置或包含一些有问题的字符,但您的cli脚本是通过参数执行的,请尝试执行相同的脚本:php-f z:\path\to\php\mail.php
  • 鉴于此说明,问题很可能是MTA而不是PHP的直接问题:

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

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

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


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

    尝试将用户名和密码设置为“发件人”邮件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