2014-02-05 2 views
0

전자 메일을 데이터베이스로 다운로드하는 시스템에서 작업하고 있지만받은 편지함의 새 전자 메일 만 가져 오려고합니다. 이 순간 Imap 및 PHP의 새 이메일 만

나는이 절차를 가지고 :

I 날짜별로 추적하는 것은 정말 좋은 방법이 아니라고 생각 나는 날에만 이메일을 잡아 수있는 쿼리에 대한 것을 대체 할 그러나
//find new emails 
$news = imap_search($conn, 'SINCE "4 February 2014"'); 

Msgno 마지막으로 가지고있는 것보다 큽니다.

imap_search() 또는 Msgno가 지정된 것보다 큰 이메일 만 선택할 수있는 다른 방법이 있습니까?

+1

의견을 제안 : http://tools.ietf.org/html/rfc3501#section-6.4.4 –

+0

Dankeshön bro! UID가 유용 할 것 같습니다. –

답변

0

가능한 방법 :

$count = imap_num_msg($connection); 
for($msgno = 1; $msgno <= $count; $msgno++) { 
$headers = imap_headerinfo($connection, $msgno); 
if($headers->Unseen == 'U') { 
... do something ... 
} 
} 
+1

여기에는 계정을 사용하는 다른 IMAP 클라이언트가 없다고 가정합니다. –

+0

예, "if ($ headers-> Unseen == 'U') {"행을 삭제했습니다. 데이터베이스에서 마지막 부분을 가져 와서 마지막 for에서 db로 for 루프를 시작합니다. 마지막 하나는 imap에있다. (두 제한 사이에서 각각 하나씩 다운로드) –

+0

@ChrisRusso : http://www.electrictoolbox.com/php-imap-unread-messages/ –

0

이 좋아, 그래서 결국이 다음 절차를 수행 해결 : 당신은 IMAP에있어 마지막 MSGNO를 선택

  1. 을 (imap_num_msg()를 사용)
  2. DB에서 마지막으로 얻은 MSGNO를 선택하십시오.
  3. 이제 DB의 마지막 부분과 IMAP의 마지막 부분 사이에 For를 사용하면됩니다.

중간에 everysingle 이메일을 다운로드하여 데이터베이스에 저장하십시오.

// calculamos el máximo $ maximo = imap_num_msg ($ conn);

//comenzamos desde... (from db) 
    $msgno = 1 

    //recorremos los mails 
    for($msgno <= $maximo; $msgno++) { 

     //sacamos la información del email especificado 
     $email['header'] = imap_headerinfo($conn, $nuevo); 
     $email['body']  = imap_fetchbody ($conn, $nuevo, 1); 

     $emails[] = $email; 
    } 

친절하게 생각합니다!

+0

예,하지만 메시지 순서 번호가 아닌 UID를 사용해야합니다. 메시지가 삭제되면 메시지 순서 번호 *는 감소하지만 UID는 감소하지 않습니다. – Max

관련 문제