Portál AbcLinuxu, 10. května 2025 09:55
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.