Portál AbcLinuxu, 12. prosince 2025 13:28
autoresponder unix - n n - - pipe
flags= user=nobody argv=/usr/local/sbin/autoreply/autoreply.pl $sender $mailbox
Skript se podívá do sql databáze, zda příjemce mailu má aktivní automatickou odpověď a zda již odesílateli tuto odpověď již v minulosti neposlal a pak pošle autoreply. Nicméně dále mám ještě přes /etc/postfix/mysql-virtual.cf nadefinované mimojiné forwardy. A to konkrétně:
email=jmeno@mojedomena.cz destination=jmeno@mojedomena.cz, kolega@mojedomena.czTím sice docílím toho, že mail je doručen do "mojí" schránky i do schránky kolegy, ale autoresponder v tomto případě nepředá skriptu v proměnné $mailbox jmeno@mojedomena.cz, ale kolega@mojedomena.cz. Poradí někdo, jak docílit toho, aby v tomto případě předal skriptu adresu jmeno@mojedomena.cz? Díky.
Řešení dotazu:
${mailbox}
This macro expands to the complete local part of a recip-
ient address. For example, with an address
user+foo@domain the mailbox is user+foo.
A command-line argument that contains ${mailbox} expands
to as many command-line arguments as there are recipi-
ents.
Ukaz ten skript autoreply.pl. Hadam, ze skript spatne prebira nebo zpracovava vsechny parametry.
#!/usr/bin/perl
use DBI;
use Mail::Mailer;
use MIME::Words qw(:all);
open CONF, "/usr/local/sbin/autoreply/db.conf";
#open LOG, ">/tmp/mailreply.txt";
while ($radek= {CONF}) {
chomp($radek);
{
$radek=~m/^(\w+)\s+(\S+).*$/;
$conf{$1}=$2;
}
}
close CONF;
$email=$ARGV[0];
$emailto=$ARGV[1];
#print LOG $email."\n";
#print LOG $emailto."\n";
@cas = localtime(time);
$year = 1900 + @cas[5];
$mon = "0".(1 + @cas[4]);
$day = @cas[3];
$hour = @cas[2];
$min = @cas[1];
$sec = @cas[0];
$datum = sprintf("%04d%02d%02d%02d%02d%02d", $year, $mon, $day, $hour, $min, $sec);
$dsn = "DBI:mysql:database=$conf{database};host=$conf{server};port=$conf{port}";
$reply = DBI -> connect($dsn , $conf{username} , $conf{password});
die "$DBI::errstr" if $DBI::err;
$setlatin = $reply -> prepare("SET character_set_results=latin2");
$setlatin -> execute();
$setlatin = $reply -> prepare("SET character_set_connection=latin2");
$setlatin -> execute();
$setlatin = $reply -> prepare("SET character_set_client=latin2");
$setlatin -> execute();
$select = $reply -> prepare("select id,recipient,Subject,message from autoreply where recipient='$emailto' and valid_from<'$datum' and valid_to>'$datum'");
$select -> execute();
die "$DBI::errstr" if $DBI::err;
while (($id,$recipient,$Subject,$message) = $select -> fetchrow()) {
$poslano = $reply -> prepare("select id from autoreply_sent where replyid=$id and mail_from='$email'");
$poslano -> execute();
die "$DBI::errstr" if $DBI::err;
$rownumber = $poslano -> rows();
if ($rownumber == 0) {
printf "Bude poslana zprava na mail ".$email." ve zneni ".$message;
my $mailer = Mail::Mailer->new("sendmail");
my $charset = 'ISO-8859-2';
my $mailmssg = $message;
$mailer->open({From => $emailto,
To => $email,
Subject => encode_mimewords($Subject, Charset => $charset),
'MIME-Version' => '1.0',
'Content-Type' => "text/plain; charset=$charset",
'Content-Transfer-Encoding' => '8bit',
});
print $mailer $mailmssg;
$mailer -> close();
$poslano = $reply -> prepare("insert into autoreply_sent (replyid, mail_from) values('$id', '$email')");
$poslano -> execute();
die "$DBI::errstr" if $DBI::err;
}
}
$emailto=$ARGV[1];Takze se do skriptu ta druha adresa nedostane i kdyby tam nakrasne byla. Ted je otazka jestli se predavaji adresy vsechny na zaklade toho preposilani (@#ARGV), nebo si je bude muset dohledat na zaklade uzivatele v databazi sam a nasledne preposlat na vsechny.
open LOG, ">/tmp/mailreply.txt";a nekde si tam pridej:
foreach my $arg(@ARGV) { print LOG "$arg\n"; }
Posli mail a podivej se jake parametry to predalo.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.