#!/usr/bin/perl
#
# catch remote adress and mail from queue for info to sender
# use crontab (6am, 3pm is a idea) to start it
#
# J.Augustinat 11/2008 <ja-at-regionalnetz.de>
# thanks to Michele Beltrame <mb-at-italpro.net> for qmHandle
#
use strict;
use warnings;
use diagnostics;
my $version = '1.10';
my ($queue) = '/var/qmail/queue/';
my $summary = 0;
my @array = ();
my $mytime = time();
# set delaytime 4h (*60min*60sekund)
my $delaytime = 14400;
# suggestion:
# set delaytime to 3:55:00 and delaymax = 4:55:00 and
# set differe > min AND <= max
# run cronjob every hour
# and
# use a second script with delaytime 12 hours,
# run cron for this every morning :-)
# set mailprogram
my $Sendmail_Prog = "/usr/sbin/sendmail";
# your service-mailadress
my $mailfrom = '[email protected]';
# read lifetime
my $day = 0;
my $lifetime = '/var/qmail/control/queuelifetime';
if (-e $lifetime){
open(DAYS, $lifetime);
$day = <DAYS>/86400;
close(DAYS);
}
else{
$day = 7;
}
# START #
# Create a message list for remote queues
my (@msglist) = ();
foreach my $currentqueue ("remote") {
opendir(DIR,"${queue}$currentqueue");
my (@dirlist) = grep !/\./, readdir DIR;
closedir DIR;
foreach my $dir (@dirlist) {
opendir (SUBDIR,"${queue}${currentqueue}/$dir");
my (@files) = grep !/\./, map "$dir/$_", readdir SUBDIR;
foreach my $file (@files) {
my $Datei = "${queue}${currentqueue}/$file";
my @info = stat($Datei);
my $differe=$mytime-$info[9];
if ($differe>$delaytime) {
push @msglist, "$file";
}
}
closedir SUBDIR;
}
}
# read for remote message list
my ($q) = shift;
my (%ret, %date, %from, %subj, %to, %allto);
if ($summary == 0) {
foreach my $msg(@msglist) {
# Read return path
open (MSG, "${queue}info/$msg");
$ret{$msg} = <MSG>;
substr($ret{$msg}, 0, 1) = '';
chop ($ret{$msg});
close (MSG);
# Read all remote (D=Done,T=Todo)
open (MSG, "${queue}remote/$msg");
$allto{$msg} = <MSG>;
chop ($allto{$msg});
close (MSG);
# Read something from message header (sender, receiver, subject, date)
open (MSG, "${queue}mess/$msg");
while (<MSG>) {
if ($_ =~ /^Date: /) {
$date{$msg} = $';
chop ($date{$msg});
}
elsif ( $_ =~ /^From: /) {
$from{$msg} = $';
chop ($from{$msg});
}
elsif ( $_ =~ /^Subject: /) {
$subj{$msg} = $';
chop ($subj{$msg});
}
elsif ( $_ =~ /^To: /) {
$to{$msg} = $';
chop ($to{$msg});
}
elsif ( $_ eq "\n") {
last;
}
}
close (MSG);
}
}
{
# split the remote todo
foreach my $msg(@msglist) {
my $Stop = 0;
my @Reci = ();
my $todo = "";
my ($dir, $rmsg) = split (/\//, $msg);
if ($summary == 0) {
@array=split(/\0/,$allto{$msg});
foreach (@array){
$todo = $_ ;
if ($todo =~ /^T/) {
substr($todo, 0, 1) = '';
push (@Reci,"$todo\n");
}
}
# -------> e-mail send:
# i use $Stop because no $ret im mail from postmaster
$Stop = index ($ret{$msg},"@");
if ($Stop > 0) {
open(MAIL,"|$Sendmail_Prog -t") || print STDERR "Mailerror,no start \n";
print MAIL "From: $mailfrom\n";
print MAIL "To: $ret{$msg}\n";
print MAIL "Subject: eMail $subj{$msg} \n\n";
print MAIL "Ihre Mail vom $date{$msg} mit dem \n";
print MAIL "Betreff: $subj{$msg} \n";
print MAIL "konnte bisher nicht an folgende Empfänger zugestellt werden: \n\n";
print MAIL "@Reci \n\n" ;
print MAIL "Diese Infomail erhalten Sie max. $day Tage lang!\n";
print MAIL "Bitte Infos unter http://irgendwo.yourdomain.de/xx.html lesen!\n";
close(MAIL);
# print "Sender : $from{$msg}\n"; # for test
# print "Return : $ret{$msg}\n"; # comment from
# print "Betreff: $subj{$msg} \n"; # open->close MAIL and
# print "sending: $date{$msg} \n";# uncomment
# print "todo @Reci \n\n" ; # this line
}
}
}
}