package Email::Folder::Exchange;
use base qw(Email::Folder);
use strict;
use warnings;
our $VERSION = '2.0';
use Email::Folder;
use Email::Folder::Exchange::WebDAV;
use Email::Folder::Exchange::EWS;
use Data::Dumper;
use URI;
use LWP::UserAgent;
sub new {
my ($self, $class, $url, $username, $password) = ({}, @_);
bless $self, $class;
# try EWS first
my $folder;
eval {
$folder = Email::Folder::Exchange::EWS->new($url, $username, $password);
};
if($@ =~ /Not Found/) {
# try WebDAV second
$folder = Email::Folder::Exchange::WebDAV->new($url, $username, $password);
}
# re-raise
die $@ if $@;
return $folder;
}
1;
__END__
=head1 NAME
Email::Folder::Exchange - Access your Microsoft Exchange 2000/2003/2007/2010 email from perl
=head1 SYNOPSIS
use Email::Folder::Exchange;
# Access Exchange 2000/2003 via WebDAV
my $folder = Email::Folder::Exchange->new('http://owa.myorg.com/user/Inbox', 'user', 'password');
# Access Exchange 2007/2010 via Exchange Web Services
my $folder = Email::Folder::Exchange->new('http://owa.myorg.com', 'user', 'password');
for my $message ($folder->messages) {
print "subject: " . $subject->header('Subject');
}
for my $folder ($folder->folders) {
print "folder uri: " . $folder->uri->as_string;
print " contains " . scalar($folder->messages) . " messages";
print " contains " . scalar($folder->folders) . " folders";
}
=head1 DESCRIPTION
Add access to Microsoft Exchange to L<Email::Folder>. Contains API enhancements
to allow folder browsing.
Email::Folder::Exchange is a wrapper around two modules [included]:
=over
=item L<Email::Folder::Exchange::WebDAV> - Access Exchange 2000/2003 via WebDAV
=item L<Email::Folder::Exchange::EWS> - Access Exchange 2007/2010 via EWS
=back
Each module has its own extensions to the Email:Folder protocol.
First, the module tries to connect via EWS. If the server reports a 404 error,
the module attempts to fallback to WebDAV.
=head2 new($url, [$username, $password])
Create Email::Folder::Exchange object and login to OWA site.
=over
=item url
URL of the target folder.
=item username
Username to authenticate as. Generally in the form of 'domain\username'.
Overrides URL-supplied username if given.
=item password
Password to authenticate with. Overrides URL-supplied password.
=back
=head2 messages()
Return a list containing all of the messages in the folder. Can only be called
once as it drains the iterator.
=head2 next_message()
Return next message as L<Email::Simple> object from folder. Acts as iterator.
Returns undef at end of folder contents.
=head2 folders()
Return a list of L<Email::Folder::Exchange> objects contained within base
folder. Can only be called once as it drains the iterator.
=head2 next_folder()
Return next folder under base folder as L<Email::Folder::Exchange> object. Acts
as iterator. Returns undef at end of list.
=head2 uri()
Return L<URI> locator object for current folder.
=head1 CAVEATS
Can't locate object method "new" via package "LWP::Protocol::https::Socket"
Install the Crypt::SSLeay module in order to support SSL URLs
The server cannot service this request right now. Try again later.
This error indicates the mailbox is has too many messages or the specified
message is too large to retrieve via web services.
=head1 SEE ALSO
L<Email::Folder>, L<URI>, L<Email::Simple>, L<Crypt::SSLeay>
=head1 AUTHOR
Warren Smith <lt>wsmith@cpan.org<gt>
=head1 COPYRIGHT AND LICENSE
Copyright (C) 2011 by Warren Smith
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.4 or,
at your option, any later version of Perl 5 you may have available.
=cut