Доброго времени! На сайте, сделанном на джумле, есть самописный модуль. Суть его в следующем: На определенный почтовый адрес приходят письма. Модуль по расписанию раз в пять минут просматривает этот адрес и парсит письма от определенных адресатов. В письме содержатся курсы валют банков. После обновления php до 5.4.29 некоторые письма перестали парситься и в курсы встают пустые значения. Была выявлена закономерность: письма, приходящие в utf8 - это те, которые некорректно парсятся. Те же, которые были в koi-8 - с ними все хорошо. Где копать? совершенно не понятно. Код (Text): <? //error_reporting(0); /* Constants */ define('MOD_PROTECT',true); setlocale(LC_ALL,'ru_RU.CP1251'); define('ADODB_ASSOC_CASE',0); // sets all returned column names to Lower require_once('adodb/adodb.inc.php'); require_once('rfc822_addresses.php'); require_once('mime_parser.php'); require_once('mimedecode.inc.php'); require('config.php'); $db = NewADOConnection('mysql'); //$db->debug = true; if (!$db) die("Connection failed"); $db->Connect($sql_server,$sql_login,$sql_password,$sql_db); unset($sql_login,$sql_password); $db->SetFetchMode(ADODB_FETCH_ASSOC); $mime = new mime_parser_class; $mime->decode_bodies = 1; $mime->ignore_syntax_errors = 0; $server = 'localhost'; $port = 110; $login = 'kurs'; $pass = 'IIQ2Vn7zEHRTMfC'; $pop_conn = fsockopen($server, $port, $errno, $errstr, 10); $code = fgets($pop_conn,1024); fputs($pop_conn,"USER $login\r\n"); $code = fgets($pop_conn,1024); fputs($pop_conn,"PASS $pass\r\n"); $code = fgets($pop_conn,1024); fputs($pop_conn,"STAT\r\n"); $code = fgets($pop_conn,1024); $code = explode(" ",$code); $msg_count = intval($code[1]); echo "<date>".date("Y-m-d H:i:s")."</date>"; echo "<countNewMessage>Новых сообщений: $msg_count</countNewMessage>"; if($msg_count < 1) echo "<result>Процедура завершена.</result>"; for($i = 1;$i <= $msg_count; $i++) { $results = array(); echo "<msgNum>Сообщение $i</msgNum>"; fputs($pop_conn,"RETR $i\r\n"); $text = get_data($pop_conn); $msg_subject = ''; if ($mime->Decode(Array('Data' => $text), $decoded)) { if ($mime->Analyze($decoded[0], $results)) { // $msg_subject = $results['Subject']; } } $email_from = $results['From'][0]['address']; $encoding=$results['Encoding']; //$data=$results['Data']; $text = eregi_replace("\<br\>","\n",$text); /*******/ if($kurs_fulllog == "1") { $title = 'test_abs'; //$mess = 'test_abs_message'; $to = '@@@@gmail.com'; $from='debug@alt-banks.ru'; mail($to, $title, $text, 'From:'.$from); } $mimedecoder = new MIMEDECODE($text,"\r\n"); $data = $mimedecoder->get_parsed_message(); $data = strip_tags($data); if(strlen($data)<30) $data=$text; if(eregi("utf-8", $encoding)) $data = iconv("utf-8", "windows-1251",$data); if(eregi("koi8-r", $encoding)) $data = iconv("koi8-r", "windows-1251",$data); // replace unconverted symbols $data = str_replace("=3D","=",$data); $data = str_replace("=5F","_",$data); $data = eregi_replace("\<br\>","\n",$data); if($kurs_fulllog == "1") { $rand=md5(rand(100000,1).microtime()); if(!is_dir($kurs_logdir.date("Ymd"))) { mkdir($kurs_logdir.date("Ymd")); chmod($kurs_logdir.date("Ymd"),0777); } $fname = $kurs_logdir.date("Ymd")."/".$rand.".msg"; $ffile = fopen($fname,"a"); if($ffile) { fputs($ffile, "From: $email_from\n"); fputs($ffile, "Encoding: $encoding\n"); fputs($ffile, "Parsed:\n$data\n"); fputs($ffile, "Source:\n$text"); } } process_letter($data, $email_from); if($kurs_fulllog == "1") fclose($ffile); fputs($pop_conn, "DELE $i\r\n"); $code = fgets($pop_conn,1024); } fputs($pop_conn,"QUIT\r\n"); $code = fgets($pop_conn,1024); fclose($pop_conn); function get_data($pop_conn) { $data = ""; while (!feof($pop_conn)) { $buffer = chop(fgets($pop_conn,1024)); $data .= "$buffer\r\n"; if(trim($buffer) == ".") break; } return $data; } function process_letter($body,$from_email) { global $db,$kurs_fulllog,$ffile; echo "<processHead>Обработка письма от $from_email</processHead>"; $from_email = trim($from_email); if(strlen($from_email)>8) { $bankid = intval(get_bankid($from_email)); if($bankid > 0) { echo "<bankId>ID банка: $bankid</bankId>"; $body = explode("\n",$body); if($kurs_fulllog == "1") { //debug print_r($body); } foreach($body AS $str) { if(eregi("USD_BUY=",$str) && !$usd_buy) { $str = str_replace(",",".",$str); $usd_buy = eregi_replace("(.*)USD_BUY=([0-9.,]*)(.*)","\\2",$str); $usd_buy = str_replace('..', '.', $usd_buy); echo "<course>USD покупка: $usd_buy</course>"; } elseif(eregi("USD_SELL=",$str) && !$usd_sell) { $str = str_replace(",",".",$str); $usd_sell = eregi_replace("(.*)USD_SELL=([0-9.,]*)(.*)","\\2",$str); $usd_sell = str_replace('..', '.', $usd_sell); echo "<course>USD продажа: $usd_sell</course>"; } elseif(eregi("EURO_BUY=",$str) && !$euro_buy) { $str = str_replace(",",".",$str); $euro_buy = eregi_replace("(.*)EURO_BUY=([0-9.,]*)(.*)","\\2",$str); $euro_buy = str_replace('..', '.', $euro_buy); echo "<course>Euro покупка: $euro_buy</course>"; } elseif(eregi("EURO_SELL=",$str) && !$euro_sell) { $str = str_replace(",",".",$str); $euro_sell = eregi_replace("(.*)EURO_SELL=([0-9.,]*)(.*)","\\2",$str); $euro_sell = str_replace('..', '.', $euro_sell); echo "<course>Euro продажа: $euro_sell</course>"; } elseif(eregi("KZT_BUY=",$str) && !$kzt_buy) { $str = str_replace(",",".",$str); $kzt_buy = eregi_replace("(.*)KZT_BUY=([0-9.,]*)(.*)","\\2",$str); $kzt_buy = str_replace('..', '.', $kzt_buy); echo "<course>KZT покупка: $kzt_buy</course>"; } elseif(eregi("KZT_SELL=",$str) && !$kzt_sell) { $str = str_replace(",",".",$str); $kzt_sell = eregi_replace("(.*)KZT_SELL=([0-9.,]*)(.*)","\\2",$str); $kzt_sell = str_replace('..', '.', $kzt_sell); echo "<course>KZT продажа: $kzt_sell</course>"; } elseif(eregi("CNY_BUY=",$str) && !$cny_buy) { $str = str_replace(",",".",$str); $cny_buy = eregi_replace("(.*)CNY_BUY=([0-9.,]*)(.*)","\\2",$str); $cny_buy = str_replace('..', '.', $cny_buy); echo "<course>CNY покупка: $kzt_buy</course>"; } elseif(eregi("CNY_SELL=",$str) && !$cny_sell) { $str = str_replace(",",".",$str); $cny_sell = eregi_replace("(.*)CNY_SELL=([0-9.,]*)(.*)","\\2",$str); $cny_sell = str_replace('..', '.', $cny_sell); echo "<course>CNY продажа: $kzt_sell</course>"; } elseif(eregi("GBP_BUY=",$str) && !$gbp_buy) { $str = str_replace(",",".",$str); $gbp_buy = eregi_replace("(.*)GBP_BUY=([0-9.,]*)(.*)","\\2",$str); $gbp_buy = str_replace('..', '.', $gbp_buy); echo "<course>GBP покупка: $kzt_buy</course>"; } elseif(eregi("GBP_SELL=",$str) && !$gbp_sell) { $str = str_replace(",",".",$str); $gbp_sell = eregi_replace("(.*)GBP_SELL=([0-9.,]*)(.*)","\\2",$str); $gbp_sell = str_replace('..', '.', $gbp_sell); echo "<course>GBP продажа: $kzt_sell</course>"; } elseif(eregi("CHF_BUY=",$str) && !$chf_buy) { $str = str_replace(",",".",$str); $chf_buy = eregi_replace("(.*)CHF_BUY=([0-9.,]*)(.*)","\\2",$str); $chf_buy = str_replace('..', '.', $chf_buy); echo "<course>CHF покупка: $chf_buy</course>"; } elseif(eregi("CHF_SELL=",$str) && !$chf_sell) { $str = str_replace(",",".",$str); $chf_sell = eregi_replace("(.*)CHF_SELL=([0-9.,]*)(.*)","\\2",$str); $chf_sell = str_replace('..', '.', $chf_sell); echo "<course>CHF продажа:</b> $chf_sell</course>"; } } $now = date("Y-m-d H:i:s"); // $db->debug=true; if($kurs_fulllog == "1") fputs($ffile, "\nSQL:UPDATE altb_courses SET usd_buy='$usd_buy', usd_sell='$usd_sell', euro_buy='$euro_buy', euro_sell='$euro_sell', kzt_buy='$kzt_buy', kzt_sell='$kzt_sell', cny_buy='$cny_buy', cny_sell='$cny_sell', gbp_buy='$gbp_buy', gbp_sell='$gbp_sell', chf_buy='$chf_buy', chf_sell='$chf_sell', lastupdate='$now' WHERE id='$bankid'"); $req = $db->Execute("UPDATE altb_courses SET usd_buy='$usd_buy', usd_sell='$usd_sell', euro_buy='$euro_buy', euro_sell='$euro_sell', kzt_buy='$kzt_buy', kzt_sell='$kzt_sell', cny_buy='$cny_buy', cny_sell='$cny_sell', gbp_buy='$gbp_buy', gbp_sell='$gbp_sell', chf_buy='$chf_buy', chf_sell='$chf_sell', lastupdate='$now' WHERE id='$bankid'"); echo "<result>"; echo ($req) ? "Курсы успешно обновлены!" : "Ошибка обновления курсов (ошибка запроса)"; echo "</result>"; // $req=$db->Execute("INSERT INTO kurs_update SET usd_buy='$usd_buy', usd_sell='$usd_sell', euro_buy='$euro_buy', euro_sell='$euro_sell', kzt_buy='$kzt_buy', kzt_sell='$kzt_sell', cny_buy='$cny_buy', cny_sell='$cny_sell', gbp_buy='$gbp_buy', gbp_sell='$gbp_sell', chf_buy='$chf_buy', chf_sell='$chf_sell', id='$bankid', adddate='$now', userid='0'"); } else return; } else return; } function get_bankid($from_email) { global $db; $from_email = trim(strtolower($from_email)); $query = $db->Execute("SELECT id, email FROM altb_courses"); while($array = $query->FetchRow()) { extract($array); $email = trim(strtolower($email)); if(eregi(",",$email)) { $email = explode(",",$email); $email = array_map('trim', $email); if(in_array($from_email,$email)) return $id; } else { if($email == $from_email) return $id; } } return 0; } echo "\n\n"; ?>
Во-первых, уходите от функций, начинающихся на ereg, меняйте их на preg, ereg устарело и скоро будет выпилено. Во-вторых, давать простыню на несколько десятков килобайт, мол, разбирайтесь сами - это моветон. В-третьих, раз уж вы обнаружили источник ошибки (не парсится utf-8, но парсится koi-8, о боги, оказывается, он еще жив) - сделайте iconv обратно в koi-8. Ну, и в-четвертых, что-то мне подсказывает, что есть более простые способы получать курсы валют, чем парсить приходящие письма.