Глобально отключить вызов функции, кроме одного места - PullRequest
1 голос
/ 25 августа 2011

У меня довольно своеобразная ситуация. Пользователь на моем сайте, который указан для получения уведомлений по электронной почте, не получает свои электронные письма. После некоторого дальнейшего исследования, похоже, это связано с тем, что exim (по умолчанию) устанавливает 'envelope-from' в @, что не может быть проверено провайдером электронной почты пользователя. Вот почему я написал фреймворк для обработки всех электронных писем некоторое время назад (до того, как узнал об этом пользователе). Эта функция устанавливает правильные заголовки и устанавливает дополнительный параметр -f, чтобы exim установил правильный адрес электронной почты в качестве адреса конверта.

Однако по совершенно неизвестным мне причинам этот пользователь, похоже, не получает свои электронные письма, генерируемые этой функцией. Я интенсивно искал свои сценарии, и я на 99,99% уверен, что нет другого места, откуда этот пользователь мог бы получать свои электронные письма, не говоря уже о том, что нигде нет другого вызова функции mail () / автоматические скрипты. Я хотел бы сказать, что я на 100% уверен в этом, но тот факт, что пользователь все еще получает плохо составленные электронные письма (неправильный конверт и отсутствующие заголовки), как-то противоречит этому. Я написал другой обработчик ошибок, который ведет обширную регистрацию, поэтому я знаю, что электронная почта не создается таким образом из-за какой-то ошибки.

Вот почему я хотел бы отключить функцию mail () глобально, чтобы любые вызовы к ней не выполнялись, за исключением одного места в моей почтовой структуре. Поскольку параметр ini disable_functions может быть установлен только в php.ini, я не могу динамически изменить это с помощью ini_set () / ini_restore (). Таким образом, мой вопрос: как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Настройка disable_functions помечена как изменяемая с PHP_INI_ALL.Это означает, что вы можете установить его, используя ini_set.Вы также можете добавить его в файл .htaccess.

Вы можете использовать override_function, чтобы перехватывать любые вызовы на mail() и переадресовывать их в свою собственную библиотеку.

0 голосов
/ 25 августа 2011

Я думаю, что вы можете отключить функцию mail () глобально и изменить свой вызов mail (), когда вам нужен какой-то классовый вызов, который не использует mail () (это должно быть возможно с помощью сокетов ведьм) или просто простой вызов sendmail / Qmail /? с exec / system и т. д.

Вы также можете вызвать другой php-скрипт с помощью exec / system / etc. который использует другой файл конфигурации. Пример сценария:

<?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";');
...