[php] vreemd probleem met verwijderen email met imap optie

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • rob3rt
  • Registratie: Maart 2009
  • Laatst online: 07-07 13:01
Ik probeer een simpel scripje te maken waarmee ik alle aanwezig emails in de "inbox" moet uitlezen, vervolgens opslaan (in database) en dan allemaal verwijderen.

Dit alles lukt prima tot de laatste stat, dat is namelijk het verwijderen.
Ik begrijp niet waarom dit niet werk, heb de handleiding al weet ik veel hoe vaak bekeken en gezocht op google, volgens mij doe ik het toch goed en werkt het niet.

Ik heb dit stukje code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
   $mbox = imap_open( "{"".$row_conf['server']."":143/notls}", "" . $row_conf['username'] . "", "" . row_conf['password']."" );
    $numMessages = imap_num_msg( $mbox );
    for ( $i = 1; $i <= $numMessages; $i++ )
    {
        $header = imap_header( $mbox, $i );
        $id = imap_uid( $mbox, $i );
        $mail[] = array( 'id' => $id, 'subject' => $header->subject );
    }

    if ( count( $mail ) > 0 )
    {
         $subject = count( $mail ) . " mails uitgelezen:\n";
         foreach ( $mail as $key => $val )
            {
                $subject .= $val['subject'] . "\n";
            }

       $res = insertintoDB( $subject );
        if ($res)
        {
            foreach ( $mail as $key => $val )
            {
                imap_delete($mbox, $val[id]);
            }
            imap_expunge($mbox);
        }
    }
    imap_close( $mbox );


Alles werkt, dus uitlezen, in database zetten etc.
Als ik een "echo" plaats bij imap_delete dan krijg ik ook output met het id erin.
Een var_dump van imap_delete geeft een "true" terug, echter als ik dan inlog in de mailbox (of script opnieuw run) dan staan de uitgelezen mails er nog gewoon.

Ik heb echt geen idee meer wat ik nu verkeerd doe, dit zou volgens mij gewoon moeten werken lijkt me.

Maak ik ergens nog een fout of kan iemand me op weg helpen waar de fout zit in dit script?

Acties:
  • 0 Henk 'm!

  • Facer
  • Registratie: Januari 2002
  • Niet online

Facer

Ken net.....

Rekening mee gehouden dat een IMAP delete alleen een delete flag omzet maar de mail niet daadwerkelijk verwijderd? Probeer is een imap_expunge() commando vanuit je script nadat je de delete heb uitgevoerd.

Eerste resultaat bij Google:
In the IMAP standard, when you 'delete' an item, it isn't actually deleted permanently. Instead, it's simply marked as 'deleted'. This is often displayed in email clients as a crossed-out email. At this stage, the email still exists in your mailbox, taking up space. It's merely been flagged for deletion. To actually delete the item permanently, you have to 'purge' the mailbox. Most IMAP clients have an option in one of the menus or on the toolbar called 'purge' or 'expunge'. This is what permanently deletes the email.
Bron: http://info.mt.net/index.php?page=imap-delete-mail

Zelf de PHP handleiding van het delete commando (http://php.net/manual/en/function.imap-delete.php) geeft aan:
Note:

IMAP mailboxes do not have their message flags saved between connections, so imap_expunge() must be called during the same connection in order for messages marked for deletion to actually be purged.

[ Voor 20% gewijzigd door Facer op 13-10-2012 20:48 . Reden: PHP handleiding opmerking toegevoegd ]


Acties:
  • 0 Henk 'm!

  • rob3rt
  • Registratie: Maart 2009
  • Laatst online: 07-07 13:01
yep, daarvoor gebruik ik ook het commando op het einde: imap_expunge($mbox);
Maar als ik het script draai en inlog dan zijn de mails ook helemaal niet gemarkeerd als verwijderd, ze staan er gewoon nog als "unread' in de inbox

Acties:
  • 0 Henk 'm!

  • Facer
  • Registratie: Januari 2002
  • Niet online

Facer

Ken net.....

Wat is de boolean waarde die je terugkrijgt van imap_expunge?
Tevens error_reporting op e_all gezet voor eventuele extra informatie?

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 21:12

Damic

Tijd voor Jasmijn thee

Zie eens wat je terug krijgt van je expunge commando, het is blijkbaar een bool variable

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • rob3rt
  • Registratie: Maart 2009
  • Laatst online: 07-07 13:01
ja het is inderdaad een boolean true, maar dit is toch goed?

met error_reporting(E_ALL &~E_NOTICE); erbij, geen enkele melding

Acties:
  • 0 Henk 'm!

  • Damic
  • Registratie: September 2003
  • Laatst online: 21:12

Damic

Tijd voor Jasmijn thee

mmmh dat is raar, iets in de instellingen van de server wat betreft imap?

Al wat ik aanraak werk niet meer zoals het hoort. Damic houd niet van zijn verjaardag


Acties:
  • 0 Henk 'm!

  • rob3rt
  • Registratie: Maart 2009
  • Laatst online: 07-07 13:01
nee, niet dat ik weet.
heb ook al op een andere server geprobeerd, zelfde effect.

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 21:59
Die IMAP functies werken met sequence nummers of met UID. Op regel zes bouw je een lijst op waar je voor elke bericht de IMAP UID gebruikt. Dat is op zich goed.

In je imap_delete() aanroep gebruik je die id om het bericht te verwijderen, maar die ID is dus een uid terwijl imap_delete() daar een sequencenummer verwacht.

Voeg eens FT_UID toe als derde argument aan je imap_delete(). Dus:
code:
1
imap_delete($mbox, $val[id], FT_UID);


imap_delete behandeld dan het tweede argument niet als een toevallig volgnummer maar beschouwd het dan als een UID.
Pagina: 1