[Koha] How to receive reports to email

Katrin Fischer katrin.fischer.83 at web.de
Fri Feb 15 07:12:31 NZDT 2019


Hi,

I think it might not be well known, but Koha has already a command line
script that you can run as a cronjob to email you the results of any report:

http://git.koha-community.org/gitweb/?p=koha.git;a=blob;f=misc/cronjobs/runreport.pl

Hope this helps!

Katrin


On 14.02.19 18:33, Paul Hoffman wrote:
> 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.
>


More information about the Koha mailing list