2010-06-02 4 views
0

IMAP 서버에 연결하여 들어오는 이메일을 처리하는 PHP 데몬을 만들려고합니다. 작동에 가까워 지지만 데몬은 원래 이메일을 계속 가져옵니다. 데몬이 처음로드 될 때 찾습니다. 그 이유는 내가 부모 프로세스에서 IMAP 연결을 열었 기 때문이라고 생각합니다. 아래 예 :PHP System_Daemon 및 IMAP 연결 관련 문제

if ($imapConnection=imap_open($authhost,$user,$pass) or die()) 
{ 
    //start daemon 
    while() 
    { 
    //Grab email headers 
    $imapHeaders = imap_headers($imapConnection); 
    $count = sizeof($imapHeaders) 

    //loop the emails 
    for($i = 1; $i <= $count, $i++) 
    { 
     //process the email 
     //delete the email 
    } 

    System_Daemon::iterate(15); 
    } 
} 
imap_close($imapConnection); 

루프 내에 IMAP 연결을 설정하지 않으려합니다. 루프 외부에서 IMAP 서버에 대한 연결을 유지하면서 새 이메일을 계속 수신하려면 어떻게해야합니까?

답변

1

IMAP에서 메일은 서버에 남아 있습니다. 따라서 올 때마다 명시 적으로 제거하지 않으면 오래된 이메일이 계속 남아 있습니다. 이러한 전자 메일을 처리하지 못하도록 이전에 처리 한 메일의 양을 유지하는 var를 가질 수 있으므로 $ i = 0 (마지막으로 도착한 것으로 가정)에서 $ i < $ var로 이동할 수 있습니다. 여기서 $ var는 이미 치료 된 메일.

편집 : 당신이 imap_delete하여 메일을 삭제 각 루프에서 imap_expunge을 할 수 있기 때문에

.

편집 2 :

사용 imap_reopen, 나는 각 루프 후 imap_reopen($imapConnection, "{domain.tld}INBOX");를 사용하여 내 서버에 당신 스크립트를 시도하고 이제 새로운 메일을 본다. 새로운 인증을하지 않고 스트림을 이동하십시오.

+0

실제로 처리를 마친 후 루프 내의 이메일을 삭제합니다. 이메일을 삭제할 때도 내가 제안한 것을해야합니까? – mike

+0

또한 일단 데몬이 시작되면 나중에 들어오는 새 전자 메일을 찾지 못하는 것입니다. 그래서 루프 밖에서 연결하는 것과 관련이 있다고 생각합니다. 이메일을 삭제하고 동일한 이메일을 계속 반복한다는 사실조차 모릅니다. – mike

+0

확인. 어쩌면 당신은 캐시 문제가 있고 OP_SHORTCACHE 옵션으로 [imap_open] (http://fr.php.net/manual/en/function.imap-open.php)을 시도 할 수 있습니까? –