Глюк с mail header на PHP5

sax player

Новичок
Глюк с mail header на PHP5

Уважаемые господа,
если на форуме это уже обсуждалось - пардон
Суть вопроса:
При отправке почты я всегда использую heraders, в частности:

PHP:
$headers = 'From:'.$from."\r\n";
$headers  .= 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n";
Всегда все работало.
Однако на одном из моих хостов поставили PHP5.
Теперь если
$from = '[email protected]'
письмо приходит от [email protected], т.е. добавляется имя хоста.
Как этого избежать?
ini_set('sendmail_from','yyy') или ini_set('sendmail_path','yyy') не дает ничего

Заранее спасибо
 

baev

‹°°¬•
Команда форума
По-моему, PHP5, да и вообще PHP, тут совершенно не при чём: обратитесь к хостеру, чтоб MTA правильно настроил.

ini_set('sendmail_path','yyy')
— это Вы чего такое интересное сделать пытались?
 

Gorynych

Посетитель PHP-Клуба
смешной вопрос: пробел между From: и $from в реальном коде не пропущен?
 

sax player

Новичок
Да ничего особенного - обычная отсылка почты с корректным обратным адресом.
Т.е., как я понял, PHP не помогает?
К слову - мне уже пришлось с каждым скриптом вызывать инклюд, который отключает Регистер Глобалс и включает вывод Error message. Вот я и подумал - может, можно добавить еще директивку в этот инклюд.
А с HP5 уже были проблемы - пришлось все скрипты пересматривать на предмет неинициализированных переменных...

-~{}~ 29.07.06 18:48:

Пробел не пропущен, хедер приходит правильно, просто к нему еще и домен привязывается
 

Wicked

Новичок
мне интересно, как именно пхп скрипт отключает регистер глобалс
 

sax player

Новичок
По поводу HP5 - неинициализированные переменные запрещены. Поэтому, напр..
PHP:
if($check)
д
PHP:
if(isset($check))
ает ошибку, надо менять на

-~{}~ 29.07.06 19:14:

Сорри за опечатку

if($check) надо менять на if(isset($check))

-~{}~ 29.07.06 19:16:

ini_set('display_errors','On');
ini_set('register_globals','Off');

-~{}~ 29.07.06 19:19:

Почему - то хостер не поставил это по умолчанию (как это есть на других моих доменах, кстати, у того же хостера. Но там РНР4
 

Gorynych

Посетитель PHP-Клуба
а зачем вот все это с регистр глобалс и т.п., а?

пример метода для отправки текстовых писем (привожу без части относящейся в методам конвертации в UTF-8):
Код:
    static private function addresses($str) {
        if ( preg_match("/^((.*)(<".self::$pattern.">)|".self::$pattern.")$/", $str, $match) ) {
            if ( sizeof($match) == 4 ) {
                return "=?utf-8?B?".base64_encode(self::str2utf($match[2]))."?=".$match[3];
            } elseif ( sizeof($match) == 2 ) {
                return $str;
            }
        }
        return null;
    }

    static public function TextMail($from, $to, $subject, $message, $cc=null, $bcc=null) {
        $from = self::addresses($from);
        if ( !$from ) {
            return false;
        }
        $to = preg_split("/,(\s+)?/", $to);
        foreach($to as &$v) {
            $v = self::addresses($v);
            if ( !$v ) {
                return false;
            }
        }
        $to = implode(",\r\n", $to);

        if ( $subject ) {
            $subject = "=?utf-8?B?".base64_encode(self::str2utf($subject))."?=";
        }
        $message = self::str2utf($message);

        $headers = "From: $from\r\n";
        if ( $cc and ($cc=self::addresses($cc)) ) {
            $headers .= "Cc: $cc\r\n";
        }
        if ( $bcc and ($bcc=self::addresses($bcc)) ) {
            $headers .= "Bcc: $bcc\r\n";
        }
        $headers .= "Content-type: text/plain; charset=utf-8\r\n";
        return mail($to, $subject, $message, $headers); 
    }
че-то мне сдается, что PHP 5 как таковой сам тут не при чем, а вот танцы вокруг него и самого сервера - очень даже может быть
 

sax player

Новичок
Господа, регистер глобалс к почте отношения не имеет, просто меня спросили - я ответил.
Я и пользую mail($to, $subject, $message, $headers)
Мы ушли от вопроса

-~{}~ 29.07.06 19:29:

Wicked
Работает.
 

Wicked

Новичок
sax player
к моменту вызова этого ini_set все globals переменные уже registered. Так что повлиять этот ini_set ни на что не может. Или я в чем-то ошибаюсь?

ПС: извиняюсь, что увожу от темы :)
 

sax player

Новичок
Wicked
Работает - если инклуд в начале скрипта (я включил его туда же, где обращаюсь к базе)

-~{}~ 29.07.06 19:48:

Получается - мы подстраиваем РНР не сервере, а потом отрабатываем скрипт с этими настройками.
А Регистер Глобалс Он, насколько я понимю, в частности любые данные из формы автоматом преврвщает в переменную. Так что легко поэкспериментировать
 

Wicked

Новичок
Это не важно, в начале или в конце. К тому моменту переменные уже существуют. Или по-твоему ini_set("register_globals", "Off") за-unset-ит переменные, созданные register_globals-ом?

-~{}~ 29.07.06 21:54:

Please note that register_globals cannot be set at runtime (ini_set()). Although, you can use .htaccess if your host allows it as described above. An example .htaccess entry: php_flag register_globals off.
&copy; http://www.php.net/manual/en/ini.core.php#ini.register-globals
 

sax player

Новичок
Да нет, а о каких переменных идет речь?
Переменных как раз нет, и Глобалс Офф как раз и запрещает их регистрировать, а заставляет обращаться к array, например $_POST['FOO']

-~{}~ 29.07.06 20:10:

Это сделано для безопасности (об этом есть в факе)

-~{}~ 29.07.06 20:15:

Это сделано для безопасности (об этом есть в факе)

-~{}~ 29.07.06 20:20:

Иначе http://mysite.com/index.php?admin=true сщздаст переменную admin со значением true! Идеально для взлома

-~{}~ 29.07.06 20:26:

А по теме что-то ничего путного...
 

Wicked

Новичок
а теперь давай проведем такой тест:

скрипт с таким содержанием
PHP:
<?php
  print "\$a ".isset($a)."<br>";
  include("там_где_происходит_ini_set_register_globals_off.php");
  print "\$a ".isset($a)."<br>";
?>
запустим с параметром ?a=a
 

sax player

Новичок
Wicked
Если переменная уже создана - она, конечно же, останется
Поэтому корректным будет такой эксперимент:

файл test.php?variable = true
ini_set('register_globals','Off');
echo $variable - не даст ничего
echo $_GET['variable'] - даст True.

А если
ini_set('register_globals',ON);
echo $variable - даст True
 

Wicked

Новичок
не вопрос, давай такой эксперимент и поставим (только "test.php?variable = true" сделаем без пробелов).
 

sax player

Новичок
А вообще это лирика. Регистер Глобалс рекомендовано отключать, он и отключен везде по умолчанию.
Я и натолкнулся случайно - мне надо было, чтобы выводились ерроры - а то невозможно отлаживать скрипты. Ну я и заглянул в PHPinfo() полезно, оказывается =) и увидел, что на этом хостинге Глобалс почему-то Он.А это - явная дыра в безопасности. НУ, я и добавил строчечку

-~{}~ 29.07.06 20:52:

Конечно, ты прав, пробелов не нужно
 
Сверху