App-wsgetmail
view release on metacpan or search on metacpan
* Sync module pod with recent changes in script
* Move script to bin/wsgetmail
* Declare Perl v5.10 minimum version
* Set minimum Perl version for the dist
* Add debug output for unsuccessful responses
* Add instruction to select Application permissions
* Move configuration instructions to App::wsgetmail
* Generate README.md from App::wsgetmail
* Remove version from pod
* Update README.md with pod from wsgetmail.pm
* Add documention for command_timeout config value
* Add vim and config to gitignore and manifest skip
* Fix default values for attributes
* Correct indent spacing in MS365.pm
* Move config_fields array into BUILDARGS sub
* Add comments about BUILDARGS for object attributes
0.05 24/1/22
* The script pod provides full details about all available
configuration options, and refers to Microsoft documentation about
how to set up the client application
{
"client_id": "abcd1234-xxxx-xxxx-xxxx-1234abcdef99",
"tenant_id": "abcd1234-xxxx-xxxx-xxxx-123abcde1234",
"secret": "abcde1fghij2klmno3pqrst4uvwxy5~0",
"global_access": 1,
"username": "rt-comment@example.com",
"folder": "Inbox",
"stripcr": 0,
"command": "/opt/rt5/bin/rt-mailgate",
"command_args": "--url=http://rt.example.com/ --queue=General --action=comment",
"command_timeout": 30,
"action_on_fetched": "mark_as_read"
}
Using App::wsgetmail as a library looks like:
my $getmail = App::wsgetmail->new({config => {
# The config hashref takes all the same keys and values as the
# command line tool configuration JSON.
}});
while (my $message = $getmail->get_next_message()) {
bin/wsgetmail view on Meta::CPAN
{
"client_id": "abcd1234-xxxx-xxxx-xxxx-1234abcdef99",
"tenant_id": "abcd1234-xxxx-xxxx-xxxx-123abcde1234",
"secret": "abcde1fghij2klmno3pqrst4uvwxy5~0",
"global_access": 1,
"username": "rt-comment@example.com",
"folder": "Inbox",
"command": "/opt/rt5/bin/rt-mailgate",
"command_args": "--url=http://rt.example.com/ --queue=General --action=comment",
"command_timeout": 30,
"action_on_fetched": "mark_as_read"
}
=head1 DESCRIPTION
wsgetmail retrieves mail from a folder available through a web services API
and delivers it to another system. Currently, it only knows how to retrieve
mail from the Microsoft Graph API, and deliver it by running another command
on the local system.
lib/App/wsgetmail.pm view on Meta::CPAN
{
"client_id": "abcd1234-xxxx-xxxx-xxxx-1234abcdef99",
"tenant_id": "abcd1234-xxxx-xxxx-xxxx-123abcde1234",
"secret": "abcde1fghij2klmno3pqrst4uvwxy5~0",
"global_access": 1,
"username": "rt-comment@example.com",
"folder": "Inbox",
"stripcr": 0,
"command": "/opt/rt5/bin/rt-mailgate",
"command_args": "--url=http://rt.example.com/ --queue=General --action=comment",
"command_timeout": 30,
"action_on_fetched": "mark_as_read"
}
Using App::wsgetmail as a library looks like:
my $getmail = App::wsgetmail->new({config => {
# The config hashref takes all the same keys and values as the
# command line tool configuration JSON.
}});
while (my $message = $getmail->get_next_message()) {
lib/App/wsgetmail.pm view on Meta::CPAN
email wsgetmail retrieves, it will run this command and pass the
message data to it via standard input.
=item command_args
Set this to a string with additional arguments to pass to C<command>.
These arguments follow shell quoting rules: you can escape characters
with a backslash, and denote a single string argument with single or
double quotes.
=item command_timeout
Set this to the number of seconds the C<command> has to return before
timeout is reached. The default value is 30. Use "inf" for no timeout.
=item action_on_fetched
Set this to a literal string C<"mark_as_read"> or C<"delete">.
For each email wsgetmail retrieves, after the configured delivery
command succeeds, it will take this action on the message.
lib/App/wsgetmail/MDA.pm view on Meta::CPAN
=head1 NAME
App::wsgetmail::MDA - Deliver mail to another command's standard input
=head1 SYNOPSIS
my $mda = App::wsgetmail::MDA->new({
command => "/opt/rt5/bin/rt-mailgate",
command_args => "--url https://rt.example.com --queue General --action correspond",
command_timeout => 15,
debug => 0,
})
$mda->forward($message, $message_path);
=head1 DESCRIPTION
App::wsgetmail::MDA takes mail fetched from web services and routes it to
another command via standard input.
=cut
lib/App/wsgetmail/MDA.pm view on Meta::CPAN
follow shell quoting rules: you can escape characters with a backslash, and
denote a single string argument with single or double quotes.
=cut
has command_args => (
is => 'ro',
required => 1,
);
=head2 command_timeout
A number. The run command will be terminated if it takes longer than this many
seconds.
=cut
has command_timeout => (
is => 'ro',
default => sub { 30; }
);
# extension and recipient are currently unused. See pod below.
has extension => (
is => 'ro',
required => 0
);
lib/App/wsgetmail/MDA.pm view on Meta::CPAN
around BUILDARGS => sub {
my ( $orig, $class, $config ) = @_;
my $attributes = {
map {
$_ => $config->{$_}
}
grep {
defined $config->{$_}
}
qw(command command_args command_timeout debug)
};
return $class->$orig($attributes);
};
=head1 METHODS
=head2 forward($message, $filename)
lib/App/wsgetmail/MDA.pm view on Meta::CPAN
sub _run_command {
my ($self, $filename) = @_;
open my $fh, "<$filename" or die $!;
my ($input, $output, $error);
unless ($self->command) {
warn "no action to delivery message, command option is empty or null" if ($self->debug);
return 1;
}
my $ok = run ([ $self->command, _split_command_args($self->command_args, 1)], $fh, \$output, \$error, timeout( $self->command_timeout ) );
unless ($ok) {
warn sprintf('failed to run command "%s %s" for file %s : %s',
$self->command,
($self->debug ? join(' ', _split_command_args($self->command_args)) : '' ),
$filename, $?);
warn "output : $output\nerror:$error\n" if ($self->debug);
}
close $fh;
return $ok;
}
( run in 0.260 second using v1.01-cache-2.11-cpan-4d50c553e7e )