Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Помогите слегка переделать ф-ю для приема почты...


Автор: Borland_Delphi_6 13.1.2005, 23:01
Код

$mail = imap_open("{localhost:110/pop3}INBOX", "admin", "123456");
$total = imap_num_recent($mail);

function retrieve_message($mbox, $messageid)
  {

  global $total;
  if ($total == 0) { $f = fopen('log.php', 'a'); fwrite($f, 'no command remaining'); fclose($f); exit; } else { $i = 0; }
  do  {
  $message = array();

  $header = imap_header($mbox, $messageid);
  $structure = imap_fetchstructure($mbox, $messageid);

  $message['subject'] = $header->subject;
  $message['fromaddress'] =  $header->fromaddress;
  $message['toaddress'] =  $header->toaddress;
  $message['ccaddress'] =  $header->ccaddress;
  $message['date'] =  $header->date;

 $message['body'] = imap_body($mbox, $messageid);
 $i++;
 //imap_delete($mail, $i);
 } while ($i != $total);
 return $message;
 }


Это наброски. Сама функция работает нормально (вернее, ее прежний вариант), если в мыльнике есть только одно письмо. Мне же нужно реализовать следущее:
Читается первое письмо, выдается результат в $message, письмо помечается для удаления, переходим ко второму письму и т.д. Я с циклами мягко говоря не очень smile

Автор: Mont 14.1.2005, 07:43
ИМХО так у тебя функция вернет только одно значение для сообщение с номером $messageid.
А что бы получать их все надо цикл вынести из функции. Т.е. в цикле вызывать эту функцию, после ее выполнения помечать на удаление, а после цикла удалить помеченные.

Сорри, код написать времени нет. Может позже напишу.

Автор: Opik 14.1.2005, 07:44
Код
function retrieve_message($mbox, $messageid)
 {
    global $total;
    $message = array();
    $i = 0;
    while ($i != $total){;
         $header = imap_header($mbox, $messageid);
         $structure = imap_fetchstructure($mbox, $messageid);
         $message['subject'] = $header->subject;
         $message['fromaddress'] =  $header->fromaddress;
         $message['toaddress'] =  $header->toaddress;
         $message['ccaddress'] =  $header->ccaddress;
         $message['date'] =  $header->date;
         $message['body'] = imap_body($mbox, $messageid);
         imap_delete($mbox, $messageid);
       $i++;
    }
    return $message;
}

Вроде так, но с imap не работал, не уверен, но цикл правильый.

Автор: Mont 14.1.2005, 07:59
Opr, цикл, правильный, но там ИМХО сама суть не верна...
передается в функцию id конкретного сообщения, поэтому смысл крутить этот цикл...
Вот если сделать так:
Код

function retrieve_message($mbox)
 {
    global $total;
    $message = array();
    $i = 0;
    while ($i != $total){;
         $header = imap_header($mbox, $i);
         $structure = imap_fetchstructure($mbox, $i);
         $message['subject'] = $header->subject;
         $message['fromaddress'] =  $header->fromaddress;
         $message['toaddress'] =  $header->toaddress;
         $message['ccaddress'] =  $header->ccaddress;
         $message['date'] =  $header->date;
         $message['body'] = imap_body($mbox, $i);
         imap_delete($mbox, $messageid);
       $i++;
    }
    return $message;
}

тогда будет по всем вертеть, но вернет в $message только последнее сообщение...

Автор: Opik 14.1.2005, 08:30
Да, терь понял
но вот так, уж точно вернет весь список smile
Код
function retrieve_message($mbox)
{
   global $total;
   $message = array();
   $i = 0;
   while ($i != $total){;
        $header = imap_header($mbox, $i);
        $structure = imap_fetchstructure($mbox, $i);
        $message['subject'] [$i]= $header->subject;
        $message['fromaddress'][$i] =  $header->fromaddress;
        $message['toaddress'][$i] =  $header->toaddress;
        $message['ccaddress'][$i] =  $header->ccaddress;
        $message['date'][$i] =  $header->date;
        $message['body'][$i] = imap_body($mbox, $i);
        imap_delete($mbox, $messageid);
      $i++;
   }
   return $message;
}

Автор: Mont 14.1.2005, 08:38
Opr smile
согласен полностьюsmile

Автор: Borland_Delphi_6 14.1.2005, 17:39
Так не работает. А вот если $i++ поставить выше, то все ок! Спасибо, по плюсику каждому ;)

Автор: Mont 14.1.2005, 20:09
Код

imap_delete($mbox, $i);

вот еще что!
только что заметил smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)