[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: работа с несколькими почтовыми акками
AlexS
Всем доброе утро. Надеюсь поможете разобраться что я делаю не так и во мне ли дело.

Суть работы скрипта (примерно, как должно быть). Есть тхт файл, такого вида:

почта@домен.ру:пароль
почта@домен.ру:пароль
почта@домен.ру:пароль
...

естественно все разные

задача - заходить в каждый ящик, смотреть есть ли там определенное письмо, если есть - то писать в другой файл:

почта@домен.ру:пароль:тема письма
почта@домен.ру:пароль:тема письма
...

Всё работает если в исходном файле - одна строка и, соот-но, 1 почтовый аккаунт. Проблема возникает если их больше одного. Срабатывает правильно только последний, а для всех что выше выводится:

Warning: imap_header() [function.imap-header]: Bad message number in Z:\home\test\www\index.php on line 21

Warning: imap_body() [function.imap-body]: Bad message number in Z:\home\test\www\index.php on line 26

Работает всё на локалхосте на денвере. Судя по ошибке не нравится интерпретатору номер сообщения, пробовал его выводить с помощью echo, для отладки, так вот, он верный только для последнего в списке почтового аккаунта, а для всех что выше - значение 0. Т.е. он его не сохраняет, что ли... И, соответственно, невозможно получить ни тело, ни заголовок письма. Не знаю уже чего делать с этим, 8 часов просидел, толку нет. Спасибо заранее. Листинг прилагаю.

PHP
<?php
$fp 
fopen"mails.txt""r" ) or die ( "Не удалось открыть файл");
$i 0;
while ( ! 
feof $fp ) ) {
$string fgets$fp1024 );
$akki[$i] = $string;
$i++;
}
fclose ($fp);
foreach (
$akki as $k =>  $string) { 
echo (
$string."<br>");
$atpos strpos($string"@");
$login substr($string0$atpos);
$endofmail strpos($string";");
$domen substr($string$atpos+1$endofmail $atpos);
$pop3 "{pop.".$domen."/pop3:110}";
$pass substr($string$endofmail+1);
$mbox imap_open($pop3$login$pass);
$msg_num imap_num_msg($mbox);
//echo($login."      ". $domen."      ". $msg_num[$k]."      ". $num."<br>");
$h imap_header($mbox$msg_num);
$h $h->from;
//foreach ($h as $k => $v) {
$mailbox $h->mailbox;
$host $h->host;
$body imap_body($mbox$msg_num);
}





Спустя 8 часов, 3 минуты, 3 секунды (5.09.2009 - 07:48) glock18 написал(а):
PHP
$string fgets$fp1024 );

ну а как же.

Спустя 2 часа, 2 минуты, 24 секунды (5.09.2009 - 09:50) AlexS написал(а):
а как тогда сделать правильно?
я думал что эта функция всё правильно вычитывает из файла, т.к. при вот таком коде печатается вот что:

PHP
echo ($string."<br>");
...
...
echo(
$login."-". $domen."-". $msg_num."-".$pass."<br>");


sagaitor@mail.ru;hwi34
sagaitor-mail.ru-0-hwi34
geneblower5@mail.ru;ia3755
geneblower5-mail.ru-0-ia3755
kristiebhe@mail.ru;cjj2p0
kristiebhe-mail.ru-6-cjj2p0



заметил только, что при копировании в блокнот из окна браузера получается вот так:

sagaitor@mail.ru;hwi34_
sagaitor-mail.ru-0-hwi34_
geneblower5@mail.ru;ia3755_
geneblower5-mail.ru-0-ia3755_
kristiebhe@mail.ru;cjj2p0
kristiebhe-mail.ru-6-cjj2p0

т.е. в конце всех строк кроме 2 последних есть пробелы

Спустя 21 минута, 23 секунды (5.09.2009 - 10:11) AlexS написал(а):
Всё, разобрался! Большое спасибо. Просто сделал обрезку пробелов... Как всё глупо оказалось))

Спустя 1 час, 1 минута, 37 секунд (5.09.2009 - 11:13) glock18 написал(а):
Прошу прощения. Я полагал, что проблема совсем в другом - как выяснилось в моем незнании того, что делает fgets.



Спустя 11 часов, 58 минут, 13 секунд (5.09.2009 - 23:11) AlexS написал(а):
Цитата (glock18 @ 5.09.2009 - 08:13)
Прошу прощения. Я полагал, что проблема совсем в другом - как выяснилось в моем незнании того, что делает fgets.

Ну, по крайней мере, Вы натолкнули меня на мысль о том том, что нужно обратить внимание на то что читается из файла. smile.gif Просто попробовал скопировать то что выводится в итоге в блокнот и заметил, что у всех, кроме последней записей в конце есть пробел. Естественно, что скрипт не может зайти на ящик по паролю с пробелом в конце...

Теперь еще вопрос возник. Не могу толком понять как работает

$h = imap_header($mbox, $msg_num);
$s = imap_fetch_overview($mbox, $msg_num);

т.е. я понимаю что эти 2 функции читают в объект данные. Объект представляет из себя как бы массив, например:

$h:
название поля (свойства объекта) значение
host "хост"
from "адрес"

ну и так далее
и то же самое с $s
вопрос тогда, зачем при использовании этих функций констукция foreach:

PHP
foreach ($h as $k =>$v) {
            
$mailbox $v->mailbox;
            
$host $v->host;
            
$personal $v->personal;
            
$email $mailbox "@" $host;
            
$my_email mysql_escape_string($email);
        }
foreach (
$s as $k =>$v) {
            
$subj $v->subject;
        }


ведь, как я понимаю, например, этот
PHP
$mailbox $v->mailbox;
оператор просто присваивает переменной $mailbox значение свойства mailbox у объекта $h. Зачем тогда здесь foreach? Просто без foreach ничего не работает, с ним - map_header выводит всё что нужно, а imap_fetch_overview из поля subject в переменную $subj пишет вместо темы какую-то странную запись, начинающуяся с "..koi8...blablabla", причем "blablabla" - на латинице, хотя тема письма в кириллице...

Если я правильно понимаю, ведь это должно работать простым присваиванием?
Вроде того что "переменной $mailbox присвоить значение поля mailbox объекта $h" ($mailbox = $h->mailbox;) и т.п. Или я не прав? Просто, наверное, я не до конца понимаю смысл работы этих функций и того что они возвращают.

Спасибо.

Спустя 12 часов, 33 минуты, 53 секунды (6.09.2009 - 11:45) glock18 написал(а):
думаю, вместо $h надо для цикла отдавать $h->from.

Или я не уловил зерно ваших размышлений.

А вообще сам вид циклов наталкивает на мысль, что все значения затираются значениями, приходящими в последней итерации.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.