Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.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&;cPanel:当一封电子邮件通过管道传输到PHP中并发生错误时,如何防止反弹?_Php_Cpanel_Email - Fatal编程技术网

PHP&;cPanel:当一封电子邮件通过管道传输到PHP中并发生错误时,如何防止反弹?

PHP&;cPanel:当一封电子邮件通过管道传输到PHP中并发生错误时,如何防止反弹?,php,cpanel,email,Php,Cpanel,Email,电子邮件通过cPanel电子邮件用户过滤成功地通过管道传输到PHP脚本中,但PHP脚本有一个执行时间限制(以防止DoS)。当出现时间限制错误时,电子邮件将反弹 尽管产生反弹的是PHP错误,但该错误实际上无法修复,这就是为什么有时间限制的原因 反弹消息的示例如下: 此邮件由邮件传递软件自动创建 您发送的邮件无法传递到其一个或多个联系人 收件人。这是一个永久性的错误。以下地址 失败: 管道到|/usr/bin/php-q/home/foo/bar/script.php 产生于moo@beer.cl

电子邮件通过cPanel电子邮件用户过滤成功地通过管道传输到PHP脚本中,但PHP脚本有一个执行时间限制(以防止DoS)。当出现时间限制错误时,电子邮件将反弹

尽管产生反弹的是PHP错误,但该错误实际上无法修复,这就是为什么有时间限制的原因

反弹消息的示例如下:

此邮件由邮件传递软件自动创建

您发送的邮件无法传递到其一个或多个联系人 收件人。这是一个永久性的错误。以下地址 失败:

管道到|/usr/bin/php-q/home/foo/bar/script.php
产生于moo@beer.cl
本地传递失败

------这是邮件的副本,包括所有的标题------
------messa的主体[…]

人们可能会想到的第一件事是,执行时间限制错误正在打印一条消息(这会自动导致反弹),但事实并非如此,因为
ini\u set('display\u errors',false)已设置。证明未打印任何内容的证据是缺少上面引用的消息中的“以下文本是在交付尝试期间生成的:…”

一个小测试:

#!/usr/bin/php -q
<?php
    set_time_limit(1);
    ini_set('display_errors', false);
    $fh_stdin = fopen('php://stdin', 'rb');
    while (true) rand();
?>
#/usr/bin/php-q

不确定这里是否有问题,但邮件处理器会反弹消息,因为当PHP脚本由于错误而异常终止时,PHP进程会向shell返回一个非零值(本例中为255)

当将电子邮件传输到脚本的MTA根据其返回值>0发现邮件失败时,它会将其视为失败并反弹邮件(可能包括反弹邮件中的任何脚本输出)

如果您不能(或不想)更改这些管道化进程的最大执行时间,一种解决方案是将消息排队,以便由其他脚本进行处理,您可以将处理分解为多个部分或增加时间限制

使用,我无法覆盖PHP的超时返回值,所以这可能不是一个解决方法


您应该能够使用
set\u time\u limit
来增加时间,除非您的PHP运行在安全模式下,无法这样做。但是,如果进程真的长时间运行,那么最好将消息排队等待处理,而不是在消息传入时尝试处理消息,因为这可能会导致瓶颈或服务器过载。

好的,我接受这超出了PHP,我考虑了给出的备选方案,但我更愿意拒绝大于1MB的电子邮件,并在不备份的情况下注册详细日志。我仍然设置了一个时间限制,只用于检测最终可能产生循环或开销的设计缺陷。尽管电子邮件会反弹,但可以对其进行调试/优化/调谐,使其永远不会发生。这节省了额外的复杂性和资源使用。请给你的答案加上我的选择。然而,我接受你的回答,因为给出的技术信息是我做出决定的基础。一个选择,尽管听起来可能相互矛盾,但就是利用电子邮件反弹来向发件人建议发送的电子邮件可能比预期的大。使用寄存器_shutdown_函数();您可以在弹出窗口内输出/打印自定义消息,如“电子邮件无法处理,因为它可能比预期的大”。@drew010-如果脚本在MTA过程中失败,那么错误写入到哪里,以便我们可以调试这些错误是什么?我正在使用cPanel电子邮件过滤器将反弹的电子邮件(针对特定的电子邮件帐户)传输到PHP脚本。当我通过管道将保存的电子邮件发送到脚本时,脚本可以从CLI工作,但过滤器管道从不执行……或者如果它执行了,并且正在出错,则不会给我任何错误。我甚至指定了一个特定的错误日志文件:
ini_set(“error_log”,“bouncedmails.log”)
@rolinger尝试显式地将error_reporting设置为E_ALL,并在邮件脚本中将errors显示为0,然后尝试error_log的绝对路径,并100%确保执行的进程可以写入它。否则,请检查cpanel/whm的Exim日志
/var/log/Exim\u mainlog
。如果邮件正在跳转,则应将其返回给发件人。请随时在我的个人资料中查找我的联系信息。