|
|
|
| Доброго времени суток!
Народ, помогите, вылетает ошибка
Fatal error: Cannot use object of type stdClass as array in /home/virtwww/w_auto-zp-ru_44475984/http/triggers/getfile.php on line 200
пытаюсь что то сделать уже несколько дней, но ничего не выходит, если закомментировать эту строку (строчка №200), то ошибка пропадает, но мне надо знать имена файлов, скачиваемых с почты на сервер. Очень нужна ваша помощь!!!!
код скрипта:
<?
Error_Reporting(E_ALL & ~E_NOTICE);
setlocale (LC_ALL, "ru_RU.CP1251");
include "../lib/connections.php";
Connect();
$sql=mysql_query("SELECT * FROM `Settings` WHERE `Id`='5';");
if($sql)$row=mysql_fetch_row($sql); $FolderForMail=$row[3];
$sql=mysql_query("SELECT * FROM `Settings` WHERE `Id`='6';");
if($sql)$row=mysql_fetch_row($sql); $MailForPrices=$row[3];
$sql=mysql_query("SELECT * FROM `Settings` WHERE `Id`='7';");
if($sql)$row=mysql_fetch_row($sql); $PassMail=$row[3];
$sql=mysql_query("SELECT * FROM `Settings` WHERE `Id`='8';");
if($sql)$row=mysql_fetch_row($sql); $MAILBOX=$row[3];
//записываем в массив все параметры для загрузки фалов
$sql=mysql_query("SELECT * FROM `SpisokSklads` WHERE `Block`='0';");
if($sql)
{
$i=0;
while($row=mysql_fetch_row($sql))
{
$SkladMailFrom[$i]=$row[19];
$SkladMailPost[$i]=$row[20];
$SkladFileName[$i]=$row[15];
$SkladFileReName[$i]=$row[16];
$SkladArchive[$i]=$row[17];
$i++;
}
$SkladKol=$i;
}
function decode_header($header, $out_charset) //декодирование имен файлов и заголовков
{
preg_match_all('/=\\?(.+?)\\?(.+?)\\?(.+?)((\\s)|\\?=|$)/', $header, $matches);
for($i = 0; $i < count($matches[0]); $i++)
{
switch( strtoupper($matches[2][$i]) )
{
case 'B': $matches[3][$i] = imap_base64($matches[3][$i]); break;
case 'QP': $matches[3][$i] = imap_qprint($matches[3][$i]); break;
default:
trigger_error('Unknown encoding: ' . $matches[2][$i]);
return false;
}
$matches[3][$i] .= $matches[5][$i];
if( strtoupper($matches[1][$i]) != strtoupper($out_charset) )
{
$matches[3][$i] = iconv($matches[1][$i], $out_charset . '//IGNORE', $matches[3][$i]);
}
}
return str_replace($matches[0], $matches[3], $header);
}
function DeArhive($FileName,$Folder)//функция разархивирования - надо указать имя файла (путь и имя файла) и путь куда разархивировать файлы
{
$zip = zip_open($FileName);
$folder = substr(str_replace("\\", "/", __FILE__), 0, strrpos(str_replace("\\", "/", __FILE__), "/"))."/".$Folder;
//echo "Папка <b>".$folder."</b><br />\n";
$files = 0;
$folders = 0;
if ($zip) {
while ($zip_entry = zip_read($zip)) {
echo "<br />\n";
$name = $folder . zip_entry_name($zip_entry);
//echo"DeArhive: ".$name."<br>";
//$name = iconv("UTF-8","windows-1251",$name);
$name=decode_header($name, 'windows-1251');
//echo"DeArhive decode_header: ".$name."<br>";
if($name[strlen($name) - 1] == '/') {
mkdir($name, 0755);
$folders++;
} elseif (zip_entry_open($zip, $zip_entry, "r")) {
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
$file = fopen($name, "w");
if ($file) {
fwrite($file, $buf);
fclose($file);
$files++;
} else {
//echo "Ошибка при открытии файла <b>".$name."</b>";
}
zip_entry_close($zip_entry);
}
}
//echo "Готово! Разархивировано <b>".$files."</b> файлов и <b>".$folders."</b> папок";
zip_close($zip);
} else {
//echo "Ошибка при открытии архива!";
}
}
function CheckArhive($Folder) //функция находит файлы-архивы и запускает функцию разархивирования - надо указать путь к папке, где искать архивы
{
// Открываем директорию
$dir = opendir($Folder);
// В цикле считываем её содержимое
while(($file = readdir($dir)))
{
$file=(string)$file;
if($file!="." && $file!="..")
if(is_resource(zip_open($Folder."".$file)))DeArhive($Folder."".$file,$Folder);
}
//закрываем директорию
closedir($dir);
}
// Первый аргумент imap_open() - сервер и путь к почтовому ящику на этом сервере
// Например, для MAIL.RU выглядит так:
define( 'MAILBOX', $MAILBOX );
// ...
define( 'USER',$MailForPrices );
define( 'PASS',$PassMail );
// Возможные виды кодирования данных
// Ввод этих констант нужен только для дальнейшего улучшения читабельности кода
define( 'ENC_7BIT', 0 );
define( 'ENC_8BIT', 1 );
define( 'ENC_BINARY', 2 );
define( 'ENC_BASE64', 3 ); // Чаще всего для передачи вложений их кодируют в base64
define( 'ENC_QUOTED_PRINTABLE', 4 );
define( 'ENC_OTHER', 5 );
// Если IMAP-библиотека не подключена или отсутствует в этой сборке
if(!function_exists('imap_open'))die('IMAP lib does not exist');
// Массив для attachment'ов (вложений)
$attachment = array();
// Соединение с почтовым сервером
if(!($mbox=imap_open(MAILBOX,USER,PASS)))die('Could not open mailbox');
// Получение кол-ва писем на сервере
$num_msg=imap_num_msg($mbox);
$from= isset($_GET['f'])? intval($_GET['f']): 1;
echo"Кол-во писем".$num_msg."<br>";
// Перебор всех писем
for($i=$num_msg;$i>0;$i--)
{
// читаем тему письма под номером $i
$obj=imap_headerinfo ($mbox, $i);
//читаем адрес отправителя
$fromname=imap_mime_header_decode($obj->fromaddress);
//$arr = isset($obj->Subject)? imap_mime_header_decode($obj->Subject) : '';
//echo "отправитель ".@convert_cyr_string($fromname[0]->text,$fromname[0]->charset,"w")."<br>";
//echo "Unseen ".$obj->Unseen."<br>";
//echo ($arr === ''? '' : convert_cyr_string($arr[0]->text,$arr[0]->charset,"w"));
$obj=imap_headerinfo($mbox,$i);
$arr=isset($obj->Subject)? imap_mime_header_decode($obj->Subject):'';
$fromname = imap_mime_header_decode($obj->fromaddress);
$From=iconv("UTF-8","windows-1251",$fromname[0]->text)."<br>";//от кого
$Post=iconv("UTF-8","windows-1251",$arr[0]->text)."<br>";//тема письма
// Структура письма
$structure = imap_fetchstructure($mbox,$i);
// Перебор частей писем (письмо, состоящее из одной части не содержит аттачей)
for($p=0;isset($structure->parts) && $p<count($structure->parts);$p++)
{
// Если это вложение, ...
if($structure->parts[$p]->ifdisposition && strtoupper($structure->parts[$p]->disposition)=='ATTACHMENT')
{
//..., то получаем его
$buffer = imap_fetchbody($mbox,$i,$p+1,FT_PEEK);
// Раскодирование
switch($structure->parts[$p]->encoding)
{
case ENC_BASE64:
{
$buffer=imap_base64($buffer);
break;
}
}
// Запихивем в массив имя файла, которое было на клиентской машине, и его содержимое
$attachment[$i]=array(
'filename'=>$structure->parts[$p]->parameters[0]->value,
'content'=>$buffer
);
//,'MailPost'=>$Post,'MailFrom'=>$From
}
else if($structure->parts[$p]->ifsubtype && strtoupper($structure->parts[$p]->subtype)=='PLAIN')
{
// Письмо без вложений - не записываеется в массив
}
}
imap_delete($mbox, $i);//помечаем письмо как удаленное
//if(imap_mail_copy($mbox, "$i:$i", "INBOX/test"))echo"1"; else echo"0";
}
//imap_expunge($mbox);//удаляем помеченные письма
// Закрытие соединения
imap_close($mbox);
for($i=0;$i<count($attachment);$i++)
{
//сравнивая значения полей "от кого" и "тема письма" находим соответствие и закачивая файлы переименовываем их для последущей загрузки
for($d=0;$d<$SkladKol;$d++){if(substr_count(strtolower($attachment[$i]['MailFrom']),strtolower($SkladMailFrom[$d]))>0)$IdMas=$d;} // строки совпадают - запоминаем позицию массива
//echo "attachment[$i]['filename']".$attachment[$i]['filename']."<br>";
$attachment[$i]['filename']=decode_header($attachment[$i]['filename'], 'windows-1251');
//если имена файлов совпадают, то используем сразу новое имя при создании файла
if($attachment[$i]['filename']==$SkladFileName[$IdMas] || substr_count(strtolower($attachment[$i]['filename']),strtolower($SkladFileName[$IdMas]))>0 && !$SkladArchive[$IdMas])
{
if(!$SkladArchive[$IdMas]){$fh=fopen($FolderForMail.$SkladFileReName[$IdMas],'wb');echo"имя файла ".$SkladFileReName[$IdMas];}
fwrite($fh,$attachment[$i]['content']);
fclose($fh);
}
if($SkladArchive[$IdMas])//если скаченный файл является архивом, запускаем функцию разархивирования и переименовываем файл
{
if($SkladArchive[$IdMas]){$fh=fopen($FolderForMail.$attachment[$i]['filename'],'wb');echo"имя архива ".$attachment[$i]['filename'];}
fwrite($fh,$attachment[$i]['content']);
fclose($fh);
CheckArhive($FolderForMail);
//if(is_file($FolderForMail.$SkladFileName[$IdMas]))rename($FolderForMail.$SkladFileName[$IdMas],$FolderForMail.$SkladFileReName[$IdMas]);
//просматриваем все файлы в директории, если файл точно совпадает с бд или частично, то переименовываем его
$dir=opendir($FolderForMail);
while(($file=readdir($dir)))
{
echo$file."<br>";
if($file==$SkladFileName[$IdMas] || substr_count(strtolower($file,strtolower($SkladFileName[$IdMas]))>0))rename($FolderForMail.$file,$FolderForMail.$SkladFileReName[$IdMas]);
}
}
}
Disconnect();
?>
|
| |
|
|
|
|
автор: .heed (07.03.2012 в 19:53) |
|
|
для: andrey215
(07.03.2012 в 19:25)
| | >$attachment[$i]=array(
'filename'=>$structure->parts[$p]->parameters[0]->value,
'content'=>$buffer
);
с200 так понимаю = $structure->parts[$p]->parameters[0]->value
я-бы попробовал сначала создать промежуточную переменную = $structure->parts[$p]->parameters[0]
, а потом присваивать значение = Переменная->value
Где-то уже замечалось что пхп парсит такое по своим непонятным представлениям
, но не утверждаю, imap_fetchstructure не юзал | |
|
|
|
|
автор: .heed (07.03.2012 в 19:56) |
|
|
для: .heed
(07.03.2012 в 19:53)
| | var_dump($structure->parts[$p]->parameters) что-то выводит? | |
|
|
|
|
|
|
|
для: .heed
(07.03.2012 в 19:56)
| | выводит это
array(1) { [0]=> object(stdClass)#6 (2) { ["attribute"]=> string(4) "NAME" ["value"]=> string(24) "=?UTF-8?B?aXptYWkueGxz?=" } } object(stdClass)#27 (0) { }
|
| |
|
|
|
|
|
|
|
для: andrey215
(09.03.2012 в 11:43)
| | кстати, только заметил, что эта ошибка вылетает тогда, когда в письме приложенный файл является архивом, если файл не архив, то все в порядке | |
|
|
|
|