[Koha] How to receive reports to email

Paul Hoffman paul at flo.org
Fri Feb 15 06:33:58 NZDT 2019


On Thu, Feb 14, 2019 at 12:30:59PM +0530, SATISH wrote:
> I need to keep print copy of daily transactions (cumulative) report for
> check-out & check-in transactions that is from library
> opening hours to closing hours every day. Currently I am running sql for
> date range for check-in & check-out.
> 
> [...]
> 
> But, I am looking for using same sql report automatically through an email
> on every day basis.

Here's one way to do it.  Start with a file that contains the SQL for 
the report, preceded by a suitable e-mail header:

--------------------- /path/to/your/reports/foobar ---------------------
From: some.email.address at example.com
To: some.other.email.address at example.com, etc.etc.etc at example.com
Subject: The report you asked for
Content-Type: text/plain

SELECT ...
FROM   ...
WHERE  ...
------------------------------------------------------------------------

Then write a Perl script that runs the report and sends the results in
tab-delimited format:

----------------------- /path/to/run-reports.pl ------------------------
#!/usr/bin/perl

use strict;
use warnings;

use C4::Context;

my $dbh = connect_to_database();

# Expand file globs
if (@ARGV == 1 && $ARGV[0] =~ /[*]/) {
    @ARGV = glob(@ARGV);
}
die "No reports to run" if !@ARGV;

# Run report(s)
foreach my $file (@ARGV) {
    open STDIN, '<', $file
        or die "Can't open $file: $!";
    my $header = read_header();
    my $sql    = read_sql();
    my $sender = find_sender($header);
    my $sth    = prepare_sql($sql);
    my $fh     = start_sendmail($sender);
    print $fh $header;
    print $fh columns_header($sth);
    while (my @row = $sth->fetchrow_array) {
        print $fh tab_delimited(@row);
    }
    close $fh or die "Close sendmail handle: $!";
    close STDIN;
}

# Functions

sub connect_to_database {
    my $dbh = C4::Context->dbh;
    $dbh->{RaiseError} = 1;
    return $dbh;
}

sub find_sendmail {
    foreach (qw(/sbin/sendmail /usr/sbin/sendmail /bin/sendmail /usr/bin/sendmail)) {
        return $_ if -x $_;
    }
    die "Can't find sendmail";
}

sub read_header {
    my $header = '';
    while (<>) {
        $header .= $_;
        last if /^\r?$/;
    }
    return $header;
}

sub find_sender {
    my ($header) = @_;
    foreach (split /\n/, $header) {
        return email($1) if /^From:\s+(.+)/;
    }
    die "No sender found in e-mail header";
}

sub email {
    local $_ = shift;
    return $1 if /^([^@\s]+\@[^@\s]+)\b/;
    return $1 if /^.+ <([^<>\s]+)>/;
    die "Can't find sender e-mail address";
}

sub read_sql {
    # Read the SQL
    local $/;
    my $sql = <>;
    return $sql;
}

sub prepare_sql {
    my $sql = shift;
    my $sth = $dbh->prepare($sql);
    $sth->execute(@_);
    return $sth;
}

sub start_sendmail {
    my ($sender) = @_;
    my $sendmail = find_sendmail();
    open my $fh, '|-', $sendmail, qw(-oi -oem -t -f), $sender
        or die "Can't exec $sendmail: $!";
    return $fh;
}

sub columns_header {
    my ($sth) = @_;
    return join("\t", @{ $sth->{'NAME'} }) . "\n";
}

sub tab_delimited {
    return join("\t", map { defined $_ ? $_ : '' } @_) . "\n";
}
------------------------------------------------------------------------

Then use koha-shell to run them:

[as root]
# koha-shell YOURINSTANCE -c '/path/to/run-reports.pl /path/to/your/reports/*'

I'll leave the rest to you -- cron, etc.

Paul.

-- 
Paul Hoffman <paul at flo.org>
Software Manager
Fenway Library Organization
550 Huntington Ave.
Boston, MA 02115
617-989-5032


More information about the Koha mailing list