Email-Folder-Exchange
view release on metacpan or search on metacpan
lib/Email/Folder/Exchange/EWS.pm view on Meta::CPAN
package Email::Folder::Exchange::EWS;
use base qw(Email::Folder);
use strict;
use warnings;
use Email::Folder;
use URI::Escape;
use LWP::UserAgent;
use Carp qw(croak cluck);
use LWP::Debug;
use constant TYPES_NS => 'http://schemas.microsoft.com/exchange/services/2006/types';
use constant MESSAGES_NS => 'http://schemas.microsoft.com/exchange/services/2006/messages';
use SOAP::Lite;
use SOAP::Lite::Utils qw(__mk_accessors);
use HTTP::Request;
use HTTP::Headers;
use MIME::Base64;
#SOAP::Lite->import( +trace => 'all' );
BEGIN {
__PACKAGE__->__mk_accessors(qw(soap folder_id unread_count display_name child_folder_count total_count _folder_ids _message_ids));
};
sub new {
my ($self, $class, $url, $username, $password) = ({}, @_);
bless $self, $class;
croak "URL required" unless $url;
my $uri = URI->new($url);
# guess the path to the exchange web service
if(! $uri->path) {
$uri->path('/EWS/Exchange.asmx');
}
# build soap accessor
my $soap = SOAP::Lite->proxy(
$uri->as_string,
keep_alive => 1,
credentials => [
$uri->host . ':' . ( $uri->scheme eq 'https' ? '443' : '80' ),
# $uri->host,
'',
$username,
$password
],
requests_redirectable => [ 'GET', 'POST', 'HEAD' ],
);
$self->soap($soap);
# EWS requires the path and method to be separated by slash, not pound
$soap->on_action( sub { MESSAGES_NS . "/$_[1]" });
# setup the schemas
$soap->ns(TYPES_NS, 't');
$soap->default_ns(MESSAGES_NS);
$soap->uri(MESSAGES_NS);
# EWS does not like the encodingStyle attribute
$soap->encodingStyle("");
$self->folder_id('inbox');
$self->refresh;
return $self;
}
sub new_from_id {
my ($self, $class, $soap, $folder_id) = ({}, @_);
bless $self, $class;
$self->soap($soap);
$self->folder_id($folder_id);
$self->refresh;
return $self;
}
sub refresh {
my ($self) = @_;
my $soap = $self->soap;
my $som = do {
local $^W; # disable warnings from SOAP::Transport::HTTP
$soap->GetFolder(
SOAP::Data
->name('FolderShape')
->value(
\SOAP::Data
->name('BaseShape')
->value('Default')
->prefix('t')
->type('')
),
SOAP::Data
->name('FolderIds')
->value(
\SOAP::Data
# CAUTION: cheap hack!
# if the folder id is longer than 64 characters then treat it as a folder id. otherwise, treat it as a named folder like 'inbox'
( run in 3.419 seconds using v1.01-cache-2.11-cpan-0d23b851a93 )