From ee43823179ee627ac16ea9da8168e5f1bf9619c0 Mon Sep 17 00:00:00 2001 From: "Jannis M. Hoffmann" Date: Thu, 29 Oct 2020 12:13:04 +0100 Subject: Initial commit; Stable version --- lib/JWebmail/Model/ReadMails.pm | 227 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 lib/JWebmail/Model/ReadMails.pm (limited to 'lib/JWebmail/Model/ReadMails.pm') diff --git a/lib/JWebmail/Model/ReadMails.pm b/lib/JWebmail/Model/ReadMails.pm new file mode 100644 index 0000000..0f2e1cc --- /dev/null +++ b/lib/JWebmail/Model/ReadMails.pm @@ -0,0 +1,227 @@ +package JWebmail::Model::ReadMails; + +use Mojo::Base -base; + +use Class::Struct AuthReadMails => { + user => '$', + password => '$', + challenge => '$', +}; + + +has 'driver'; + + +sub verify_user { + + my $self = shift; + + my ($user, $password) = @_; + + return !scalar $self->driver->communicate( + user => $user, + password => $password, + mode => 'auth', + ) +} + + +sub read_headers_for { + + my $self = shift; + + my %h = @_; + my ($auth, $folder, $start, $end, $sort) = @h{qw(auth folder start end sort)}; + + my ($resp, $rc) = $self->driver->communicate( + user => $auth->user, + password => $auth->password, + challenge => $auth->challenge, + mode => 'list', + args => [$start || '0', $end || '0', $sort || 'date', $folder || ''], + ); + die "connection error: $resp->{error}" if $rc; + return $resp; +} + + +sub count { + + my $self = shift; + + my ($auth, $folder) = @_; + + my ($resp, $rc) = $self->driver->communicate( + user => $auth->user, + password => $auth->password, + challenge => $auth->challenge, + mode => 'count', + args => [$folder], + ); + die "connection error: $resp->{error}" if $rc; + return ($resp->{size}, $resp->{count}, $resp->{new}); +} + + +sub show { + my $self = shift; + + my ($auth, $mid) = @_; + + my ($resp, $rc) = $self->driver->communicate( + user => $auth->user, + password => $auth->password, + challenge => $auth->challenge, + mode => 'read-mail', + args => [$mid], + ); + die "connection error: $resp->{error}, $resp->{mid}" if $rc; + return $resp; +} + + +sub search { + my $self = shift; + + my ($auth, $pattern, $folder) = @_; + + my ($resp, $rc) = $self->driver->communicate( + user => $auth->user, + password => $auth->password, + challenge => $auth->challenge, + mode => 'search', + args => [$pattern, $folder], + ); + die "connection error: $resp->{error}" if $rc; + return $resp; +} + + +sub folders { + my $self = shift; + + my ($auth) = @_; + + my ($resp, $rc) = $self->driver->communicate( + user => $auth->user, + password => $auth->password, + challenge => $auth->challenge, + mode => 'folders', + ); + die "connection error: $resp->{error}" if $rc; + return $resp; +} + + +sub move { + my $self = shift; + + my ($auth, $mid, $folder) = @_; + + my ($resp, $rc) = $self->driver->communicate( + user => $auth->user, + password => $auth->password, + challenge => $auth->challenge, + mode => 'move', + args => [$mid, $folder], + ); + die "connection error: $resp->{error}" if $rc; + return 1; +} + + +1 + +__END__ + +=encoding utf-8 + +=head1 NAME + +ReadMails - Read recieved mails + +=head1 SYNOPSIS + + my $m = JWebmail::Model::ReadMails->new(driver => ...); + $m->search($auth, qr/Hot singles in your area/, ''); + +=head1 DESCRIPTION + +This module is a facade for the actions of its driver. +All actions are delegated to it. + +The first parameter is authentication info as AuthReadMails +whith the rest varying. + +The communication is stateless. + +=head1 ATTRIBUTES + +=head2 driver + +The driver does the actual work of reading the mailbox. + +=head1 METHODS + +=head2 new + +Instantiate a new object. The 'driver' option is required. + +=head2 verify_user + +Checks user name and password. + +=head2 read_headers_for + +Provides bundeled information on a subset of mails of a mailbox. +Can be sorted and of varying size. + +=head2 count + +Returns size of the mail box folder in bytes the number of mails. + +=head2 show + +Returns a sepecific mail as a perl hash. + +=head2 search + +Searches for a message with the given pattern. + +=head2 folders + +List all mailbox sub folders. + +=head2 move + +Move mails between folders. + +=head1 CLASSES + +=head2 AuthReadMails + +A struct that bundles auth data. + +=head3 Attributes + +=head4 user + +The user name. + +=head4 password + +The users password in plaintext or as hmac if cram is used. + +=head4 challenge + +Optinal challange for when you use cram authentication. + +=head3 Methods + +=head4 new + +=head1 SEE ALSO + +L, L, L + +=cut \ No newline at end of file -- cgit v1.2.3