
=head1 NAME

Mail::Box::IMAP4 - handle IMAP4 folders as client


=head1 INHERITANCE

 Mail::Box::IMAP4
   is a Mail::Box::Net
   is a Mail::Box
   is a Mail::Reporter


=head1 SYNOPSIS

 use Mail::Box::IMAP4;
 my $folder = new Mail::Box::IMAP4 folder => $ENV{MAIL}, ...;


=head1 DESCRIPTION

UNDER DEVELOPMENT: CANNOT BE USED YET!

Maintain a folder which has its messages stored on a remote server.  The
communication between the client application and the server is implemented
using the IMAP4 protocol.  This class uses Mail::Transport::IMAP4 to
hide the transport of information, and focusses solely on the correct
handling of messages within a IMAP4 folder.


=head1 OVERLOADED


overload: B<"">

=over 4

See L<Mail::Box/"OVERLOADED">

=back

overload: B<@{}>

=over 4

See L<Mail::Box/"OVERLOADED">

=back

overload: B<cmp>

=over 4

See L<Mail::Box/"OVERLOADED">

=back


=head1 METHODS


=head2 Constructors


$obj-E<gt>B<create>(FOLDER, OPTIONS)

Mail::Box::IMAP4-E<gt>B<create>(FOLDER, OPTIONS)

=over 4

See L<Mail::Box::Net/"METHODS">

=back

Mail::Box::IMAP4-E<gt>B<new>(OPTIONS)

=over 4

For authentications, you
have three choices: specify a foldername which resembles an URL, or
specify a pop-client object, or separate options for user, password,
pop-server and server-port.

 Option             Defined in       Default                                                         
 access             L<Mail::Box>     C<'r'>                                                          
 authenticate                        C<'AUTO'>                                                       
 body_delayed_type  L<Mail::Box>     L<Mail::Message::Body::Delayed|Mail::Message::Body::Delayed>    
 body_type          L<Mail::Box>     L<Mail::Message::Body::Lines|Mail::Message::Body::Lines>        
 coerce_options     L<Mail::Box>     C<[]>                                                           
 create             L<Mail::Box>     <false>                                                         
 extract            L<Mail::Box>     C<10240>                                                        
 field_type         L<Mail::Box>     undef                                                           
 fix_headers        L<Mail::Box>     <false>                                                         
 folder             L<Mail::Box>     C<'/'>                                                          
 folderdir          L<Mail::Box>     <not used>                                                      
 head_delayed_type  L<Mail::Box>     L<Mail::Message::Head::Delayed|Mail::Message::Head::Delayed>    
 head_type          L<Mail::Box>     L<Mail::Message::Head::Complete|Mail::Message::Head::Complete>  
 imap_client                         undef                                                           
 keep_dups          L<Mail::Box>     <false>                                                         
 lock_file          L<Mail::Box>     undef                                                           
 lock_timeout       L<Mail::Box>     1 hour                                                          
 lock_type          L<Mail::Box>     C<'NONE'>                                                       
 lock_wait          L<Mail::Box>     10 seconds                                                      
 locker             L<Mail::Box>     undef                                                           
 log                L<Mail::Reporter>  C<'WARNINGS'>                                                   
 manager            L<Mail::Box>     undef                                                           
 message_type       L<Mail::Box>     L<Mail::Box::IMAP4::Message|Mail::Box::IMAP4::Message>          
 multipart_type     L<Mail::Box>     L<Mail::Message::Body::Multipart|Mail::Message::Body::Multipart>
 password           L<Mail::Box::Net>  undef                                                           
 remove_when_empty  L<Mail::Box>     <false>                                                         
 save_on_exit       L<Mail::Box>     <true>                                                          
 server_name        L<Mail::Box::Net>  undef                                                           
 server_port        L<Mail::Box::Net>  143                                                             
 sub_sep                             <autodetect>                                                    
 trace              L<Mail::Reporter>  C<'WARNINGS'>                                                   
 trusted            L<Mail::Box>     <false>                                                         
 username           L<Mail::Box::Net>  undef                                                           

. access MODE

. authenticate 'KERBEROS_V4'|'GSSAPI'|'SKEY'|'AUTO'

=over 4

IMAP defines various authentications mechanisms.
See Mail::Transport::IMAP4::new(authenticate).

=back

. body_delayed_type CLASS

. body_type CLASS|CODE

. coerce_options ARRAY

. create BOOLEAN

. extract INTEGER | CODE | METHOD | 'LAZY'|'ALWAYS'

. field_type CLASS

. fix_headers BOOLEAN

. folder FOLDERNAME

. folderdir DIRECTORY

. head_delayed_type CLASS

. head_type CLASS

. imap_client OBJECT

=over 4

You may want to specify your own imap-client object.  The object
which is passed must extend L<Mail::Transport::IMAP4|Mail::Transport::IMAP4>.

=back

. keep_dups BOOLEAN

. lock_file FILENAME

. lock_timeout SECONDS

. lock_type CLASS|STRING

. lock_wait SECONDS

. locker OBJECT

. log LEVEL

. manager MANAGER

. message_type CLASS

. multipart_type CLASS

. password STRING

. remove_when_empty BOOLEAN

. save_on_exit BOOLEAN

. server_name HOSTNAME

. server_port INTEGER

. sub_sep CHARACTER

=over 4

A single character used as sub-folder indicator.  The IMAP protocol is
able to find-out the right separator itself.

=back

. trace LEVEL

. trusted BOOLEAN

. username STRING

I<Example:> 

 my $imap = Mail::Box::IMAP4->new('imap4://user:password@imap.xs4all.nl');

 my $imap = $mgr->open(type => 'imap4', username => 'myname',
    password => 'mypassword', server_name => 'pop.xs4all.nl');

=back

=head2 The folder


$obj-E<gt>B<addMessage>(MESSAGE)

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<addMessages>(MESSAGE [, MESSAGE, ...])

=over 4

See L<Mail::Box/"The folder">

=back

Mail::Box::IMAP4-E<gt>B<appendMessages>(OPTIONS)

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<close>(OPTIONS)

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<copyTo>(FOLDER, OPTIONS)

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<delete>

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<folderdir>([DIRECTORY])

=over 4

See L<Mail::Box::Net/"METHODS">

=back

Mail::Box::IMAP4-E<gt>B<foundIn>([FOLDERNAME], OPTIONS)

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<name>

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<organization>

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<type>

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<update>(OPTIONS)

=over 4

See L<Mail::Box/"The folder">

=back

$obj-E<gt>B<url>

=over 4

See L<Mail::Box/"The folder">

=back

=head2 Folder flags


$obj-E<gt>B<isModified>

=over 4

See L<Mail::Box/"Folder flags">

=back

$obj-E<gt>B<modified>([BOOLEAN])

=over 4

See L<Mail::Box/"Folder flags">

=back

$obj-E<gt>B<writable>

=over 4

See L<Mail::Box/"Folder flags">

=back

=head2 The messages


$obj-E<gt>B<current>([NUMBER|MESSAGE|MESSAGE-ID])

=over 4

See L<Mail::Box/"The messages">

=back

$obj-E<gt>B<find>(MESSAGE-ID)

=over 4

See L<Mail::Box/"The messages">

=back

$obj-E<gt>B<message>(INDEX [,MESSAGE])

=over 4

See L<Mail::Box/"The messages">

=back

$obj-E<gt>B<messageId>(MESSAGE-ID [,MESSAGE])

=over 4

See L<Mail::Box/"The messages">

=back

$obj-E<gt>B<messageIds>

=over 4

See L<Mail::Box/"The messages">

=back

$obj-E<gt>B<messages>(['ALL',RANGE,'ACTIVE','DELETED',LABEL,!LABEL,FILTER])

=over 4

See L<Mail::Box/"The messages">

=back

$obj-E<gt>B<scanForMessages>(MESSAGE, MESSAGE-IDS, TIMESPAN, WINDOW)

=over 4

See L<Mail::Box/"The messages">

=back

=head2 Sub-folders


$obj-E<gt>B<listSubFolders>(OPTIONS)

Mail::Box::IMAP4-E<gt>B<listSubFolders>(OPTIONS)

=over 4

See L<Mail::Box/"Sub-folders">

=back

$obj-E<gt>B<nameOfSubFolder>(NAME)

=over 4

See L<Mail::Box/"Sub-folders">

=back

$obj-E<gt>B<openRelatedFolder>(OPTIONS)

=over 4

See L<Mail::Box/"Sub-folders">

=back

$obj-E<gt>B<openSubFolder>(NAME, OPTIONS)

=over 4

See L<Mail::Box/"Sub-folders">

=back

=head2 Internals


$obj-E<gt>B<coerce>(MESSAGE)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<determineBodyType>(MESSAGE, HEAD)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<getHead>(MESSAGE)

=over 4

Read the header for the specified message from the remote server.
C<undef> is returned in case the message disappeared.

=back

$obj-E<gt>B<getHeadAndBody>(MESSAGE)

=over 4

Read all data for the specified message from the remote server.
Return head and body of the mesasge as list, or an empty list
if the MESSAGE disappeared from the server.

=back

$obj-E<gt>B<imapClient>

=over 4

Returns the IMAP client object: a L<Mail::Transport::IMAP4|Mail::Transport::IMAP4> object.
This does not establish the connection.

=back

$obj-E<gt>B<lineSeparator>([STRING|'CR'|'LF'|'CRLF'])

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<locker>

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<read>(OPTIONS)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<readMessages>(OPTIONS)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<storeMessage>(MESSAGE)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<toBeThreaded>(MESSAGES)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<toBeUnthreaded>(MESSAGES)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<updateMessages>(OPTIONS)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<write>(OPTIONS)

=over 4

See L<Mail::Box/"Internals">

=back

$obj-E<gt>B<writeMessages>(OPTIONS)

=over 4

See L<Mail::Box/"Internals">

=back

=head2 Other methods


$obj-E<gt>B<timespan2seconds>(TIME)

Mail::Box::IMAP4-E<gt>B<timespan2seconds>(TIME)

=over 4

See L<Mail::Box/"Other methods">

=back

=head2 Error handling


$obj-E<gt>B<AUTOLOAD>

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<defaultTrace>([LEVEL, [LEVEL])

Mail::Box::IMAP4-E<gt>B<defaultTrace>([LEVEL, [LEVEL])

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<errors>

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<log>([LEVEL [,STRINGS]])

Mail::Box::IMAP4-E<gt>B<log>([LEVEL [,STRINGS]])

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<logPriority>(LEVEL)

Mail::Box::IMAP4-E<gt>B<logPriority>(LEVEL)

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<logSettings>

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<notImplemented>

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<report>([LEVEL])

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<reportAll>([LEVEL])

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<trace>([LEVEL])

=over 4

See L<Mail::Reporter/"Error handling">

=back

$obj-E<gt>B<warnings>

=over 4

See L<Mail::Reporter/"Error handling">

=back

=head2 Cleanup


$obj-E<gt>B<DESTROY>

=over 4

See L<Mail::Box/"Cleanup">

=back

$obj-E<gt>B<inGlobalDestruction>

=over 4

See L<Mail::Reporter/"Cleanup">

=back



=head1 DIAGNOSTICS

I<Error:> Cannot create IMAP4 client $url.

Connecting to the specified IMAP4 server failed.  A message about the reason
is produced as well.

I<Warning:> Cannot find head back for $uidl in $folder.

The header was read before, but now seems empty: the IMAP4 server does
not produce the header lines anymore.

I<Warning:> Cannot read body for $uidl in $folder.

The header of the message was retreived from the IMAP4 server, but the
body is not read, for an unknown reason.

I<Warning:> Changes not written to read-only folder $self.

You have opened the folder read-only --which is the default set
by L<new(access)|Mail::Box/"Constructors">--, made modifications, and now want to close it.
Set L<close(force)|"The folder"> if you want to overrule the access mode, or close
the folder with L<close(write)|"The folder"> set to C<NEVER>.

I<Error:> Copying failed for one message.

For some reason, for instance disc full, removed by external process, or
read-protection, it is impossible to copy one of the messages.  Copying will
proceed for the other messages.

I<Error:> Destination folder $name is not writable.

The folder where the messages are copied to is not opened with write
access (see L<new(access)|Mail::Box/"Constructors">).  This has no relation with write permission
to the folder which is controled by your operating system.

I<Warning:> Different messages with id $msgid.

The message id is discovered more than once within the same folder, but the
content of the message seems to be different.  This should not be possible:
each message must be unique.

I<Error:> Folder $name is opened read-only

You can not write to this folder unless you have opened the folder to
write or append with L<new(access)|Mail::Box/"Constructors">, or the C<force> option is set true.

I<Error:> Folder $name not deleted: not writable.

The folder must be opened with write access via L<new(access)|Mail::Box/"Constructors">, otherwise
removing it will be refused.  So, you may have write-access according to
the operating system, but that will not automatically mean that this
C<delete> method permits you to.  The reverse remark is valid as well.

I<Error:> Invalid timespan '$timespan' specified.

The string does not follow the strict rules of the time span syntax which
is permitted as parameter.

I<Warning:> Message $uidl disappeared from $folder.

Trying to get the specific message from the server, but it appears to be
gone.

I<Warning:> Message $uidl disappeared from $folder.

Trying to get the specific message from the server, but it appears to be
gone.

I<Warning:> Message-id '$msgid' does not contain a domain.

According to the RFCs, message-ids need to contain a unique random part,
then an C<@>, and then a domain name.  This is made to avoid the creation
of two messages with the same id.  The warning emerges when the C<@> is
missing from the string.

I<Error:> Package $package does not implement $method.

Fatal error: the specific package (or one of its superclasses) does not
implement this method where it should. This message means that some other
related classes do implement this method however the class at hand does
not.  Probably you should investigate this and probably inform the author
of the package.

I<Error:> Unable to create subfolder $name of $folder.

The copy includes the subfolders, but for some reason it was not possible
to copy one of these.  Copying will proceed for all other sub-folders.

I<Error:> Writing folder $name failed

For some reason (you probably got more error messages about this problem)
it is impossible to write the folder, although you should because there
were changes made.


=head1 DETAILS


=head2 How IMAP4 folders work


=head2 This implementation






=head1 REFERENCES

See the Mail::Box website at L<http://perl.overmeer.net/mailbox/> for more details.

=head1 COPYRIGHTS

Module version 2.042.
Written by Mark Overmeer (mark@overmeer.net).  See the ChangeLog for
other contributors.

Copyright (c) 2001-2003 by the author(s). All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.


