除一个地方外,全局禁用函数调用

时间:2011-08-25 05:20:31

标签: php sendmail

我有一种特殊的情况。我的网站上列出接收通知电子邮件的用户没有收到他的电子邮件。经过一些进一步调查后,似乎这是由于exim(默认情况下)将'envelope-from'设置为@这一事实造成的,无法通过用户的电子邮件提供商进行验证。这就是为什么我写了一个框架来处理所有电子邮件(在我了解这个用户之前)。此函数设置正确的标头并设置附加的-f参数,以便exim将正确的电子邮件地址设置为信封起始地址。

但是,由于我完全不知道的原因,该用户似乎没有收到此功能生成的电子邮件。我已经广泛搜索了我的脚本,我99.99%确定没有其他地方这个用户可以收到他的电子邮件,更不用说甚至没有其他地方的mail()函数调用到达任何地方/自动脚本。我想说我对这一点100%肯定,但是用户仍然收到构造不良的电子邮件(错误的信封和丢失的标题)这一事实与某种方式相矛盾。我编写了一个不同的error_handler来执行大量的日志记录,所以我知道电子邮件不会因为某种错误而以这种方式构建。

这就是为什么我想全局禁用mail()函数,以便对它的任何调用都会失败,除了我的邮件框架中的一个地方。由于ini设置disable_functions只能在php.ini中设置,我无法使用ini_set()/ ini_restore()动态更改它。 因此,我的问题是,我该如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

disable_functions设置被标记为可从PHP_INI_ALL更改。这意味着您可以使用ini_set进行设置。您也可以将其添加到.htaccess文件中。

您可以使用override_function来阻止对mail()的任何调用,并将其转发到您自己的库中。

答案 1 :(得分:0)

我认为你可以全局禁用mail()函数,并在你需要一些不使用mail()的类调用时更改你的mail()调用(它应该是可能的套接字)或只是简单调用sendmail / qmail的/?与执行/系统等。

你也可以使用exec / system / etc调用另一个php脚本。使用另一个配置文件。脚本示例:

<?php
if($argc < 4) {
    die('Usage: php this_script.php mail_to mail_subject mail_message [mail_additional_headers]');
}
mail($argv[1],$argv[2],$argv[3],isset($argv[4])?$argv[4]:NULL);

脚本调用示例:

exec('php  -c path_to_config_file_without_disable_function.ini that_script.php "some_user@domain.com" "some mail subject" "mail body";');