[Dovecot] Marking messages read / retaining date with Sieve

Bret Martin bam at miranda.org
Tue Feb 12 22:28:56 EET 2013


On Jan 30, 2013, at 8:39 PM, Ben Morrow <ben at morrow.me.uk> wrote:
[...]
> Mail::IMAPClient (which I usually prefer) will work with a
> preauthenticated socket, but you need to create a socketpair explicitly,
> fork and exec dovecot/imap with one end of the pair on STDIN/STDOUT,
> then pass the other end to Mail::IMAPClient->new as the Socket
> parameter. Something like this (I've left out error checking)
[...]

Thanks again for your help!

To close the loop on this, I ended up doing the following, although it seems to fail on mailboxes with large numbers of messages (on the order of 10,000 or so; I didn't test carefully enough to find the exact number)

    use Mail::IMAPClient;
    use Socket;
    use strict;
    
    socketpair( my $dovecot, my $client, AF_UNIX, SOCK_STREAM, PF_UNSPEC );
    
    unless ( fork() ) {
        open( STDIN,  '<&', $client );
        open( STDOUT, '>&', $client );
        exec( '/usr/lib/dovecot/imap' );
    }
    close( $client );
    
    my $imap = Mail::IMAPClient->new( Socket => $dovecot );
    
    foreach my $folder( sort $imap->folders() ) {
        print( "$folder\n" );
        $imap->select( $folder );
        $imap->set_flag( 'Seen', $imap->search( 'ALL' ) );
    }

For the moment the failure on large folders was easier to handle by just doing those folders manually, although I'm curious if anyone knows the reason that might fail.

--Bret




More information about the dovecot mailing list