pankaj_it09 has asked for the wisdom of the Perl Monks concerning the following question:

Hello Monks,

The below code marks the unread email as read ?
use Net::IMAP::Client; $imap->login or die('Login failed: ' . $imap->last_error); $imap->select('INBOX'); my $messages = $imap->search('ALL'); foreach my $msg (@$messages) { my $data = $imap->get_rfc822_body($msg); }
I used "del_flags" method to remark the email as unread but thought that there might be a better way.
  • Comment on How to stop get_rfc822_body method of Net::IMAP::Client package to mark an unread email as read ?
  • Download Code

Replies are listed 'Best First'.
Re: How to stop get_rfc822_body method of Net::IMAP::Client package to mark an unread email as read ?
by AppleFritter (Vicar) on May 13, 2014 at 09:38 UTC

    Looking at the get_rfc822_body code in Net::IMAP::Client and the FETCH section in RFC 3501 (pp. 53-57), I think this is part of the IMAP spec: "The \Seen flag is implicitly set; if this causes the flags to change, they SHOULD be included as part of the FETCH responses.".

    There is a BODY.PEEK data item for the FETCH command that, unlike BODY (and thus RFC822, which is what this function uses), will avoid setting the flag. The module does not currently appear to support getting message bodies that way, but maybe the author could be persuaded to add that functionality.

      I wrote an email to author sometime back related to some other functionality.
      There is no response.

        Ah, hmm, that's unfortunate.

        Maybe try again? If the author abandoned the module, though, I have no idea what the best way to proceed would be. Perhaps there is a process for taking over CPAN modules, or some kind of BCP for how to fork them.

        Looking at the spec some more, the format of the data returned by FETCH ... RFC822 appears to be equivalent to that returned by FETCH ... BODY[] (p. 78), so a new function that did what you want might be as simple as this (note -- this'd go into Net::IMAP::Client, naturally, not your code):

        sub peek_rfc822_body { my ($self, $msg) = @_; my $wants_many = undef; if (ref($msg) eq 'ARRAY') { $msg = join(',', @$msg); $wants_many = 1; } my ($ok, $lines) = $self->_tell_imap(FETCH => "$msg BODY.PEEK[]", +1); if ($ok) { my @ret = map { $_->[1] } @$lines; return $wants_many ? \@ret : $ret[0]; } return undef; }

        But this is totally untested, and as stated above, even if it works, I've no idea what the best way of getting that into the module would be.

Re: How to stop get_rfc822_body method of Net::IMAP::Client package to mark an unread email as read ?
by pankaj_it09 (Scribe) on May 13, 2014 at 12:29 UTC
    It seems there is another way to do that -->
    $imap->examine('INBOX');
    Using "examine" instead of "select".
    The folder is selected in read-only mode.