0

我使用 WHM/Cpanel

我使用管道技术将收入电子邮件转发到 php 脚本,一切正常。但是在工作时,如果在管道传输以下消息时发生任何错误,例如将返回给电子邮件发件人

This message was created automatically by mail delivery software.
  A message that you sent could not be delivered to one or more of its recipients. This is a permanent error. The following address(es) failed:

  pipe to |/home/someuser/public_htmk/pipe.php
  generated by support@somecompany.net
  local delivery failed

请注意,我从 Cpanel 为电子邮件 support@somecompany.net|/home/someuser/public_htmk/pipe.php 制作管道

下面的 php 脚本没有错误 :) 但我定义了文件的路径以产生错误,因为它应该是 public_html 而不是 public_htmk 但我犯这个错误是为了向您显示返回给电子邮件发件人的错误消息。

那么有没有办法控制这个返回的消息或禁用它。例如,是否更改它以发送我们正在运行的 php 文件的物理地址以至少通过管道传输电子邮件?

顺便说一句,我正在使用

WHM/Cpanel Dovecot PHP

这是管道脚本的示例(此脚本没有任何错误)

#!/usr/local/bin/php -q
<?php   

// read from stdin
$emg_stdf = fopen("php://stdin", "r");
$email = "";
while (!feof($emg_stdf))
{
    $emg_orgemailmsg .= fread($emg_stdf, 1024);
}
fclose($emg_stdf);

mail('me@example.org','From my email pipe!','"' . $emg_orgemailmsg . '"');

当将电子邮件传送到脚本时发生一些错误时,我正在寻找自定义或禁用返回给电子邮件发件人的返回消息。

有任何想法吗?

4

3 回答 3

2

如果您不坚持将麻烦的代码放入管道定义中,则可以在脚本周围使用 shell 脚本包装器php,例如

#!/bin/bash
/home/someuser/public_htmk/pipe.php >&/home/someuser/pipe.errors.log || true

并在您的管道定义中使用它。

于 2011-12-05T19:23:49.357 回答
0

在某些情况下,这可能会帮助您解决问题,但如果display_errors打开,脚本中的错误消息可能会触发您的 php 脚本的负面响应,从而导致消息反弹。如果将其关闭,则不会输出错误或将错误返回给 MTA。

如果由于某种原因出现致命错误,例如解析错误,那么这可能无济于事。

我不确定您是否有任何方法可以控制返回消息的内容,但您可以阻止它或尝试将消息返回给它。

exit(0);将电子邮件处理器放在末尾以指示成功可能会有所帮助,因此如果您的脚本能够到达末尾,则它会成功退出,并且可能会阻止 MTA 发送返回消息。

我不确定这是否会有所不同,但它可能有助于检查打开 php://stdin 是否成功,因为它可能由于某种原因而失败,如果您无法阅读它,则终止脚本.

要尝试控制输出,如果检测到错误,请尝试回显消息或使用exit("status message");

在您收到的返回消息中,它是否包含 PHP 输出的错误消息或失败原因?

于 2011-11-29T05:44:13.353 回答
0

我遇到了同样的问题,我通过在 root/etc 文件夹中添加一个名为 exim.conf 的文件来解决它它对我有用以下是该文件的内容希望它对其他人也有帮助!

# This transport is used for handling pipe deliveries generated by alias
# or .forward files. If the pipe generates any standard output, it is returned
# to the sender of the message as a delivery error. Set return_fail_output
# instead of return_output if you want this to happen only when the pipe fails
# to complete normally. You can set different transports for aliases and
# forwards if you want to - see the references to address_pipe in the directors
# section below.

address_pipe:
driver = pipe
return_fail_output

virtual_address_pipe:
driver = pipe
group = nobody
return_fail_output
user = "${lookup{$domain}lsearch* {/etc/virtual/domainowners}{$value}}"
于 2011-12-10T08:19:06.330 回答