Re: [exim] Calling a PERL script

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Heiko Schlittermann
Date:  
À: exim-users
Sujet: Re: [exim] Calling a PERL script
Jerry Stuckle <jerry@???> (Mi 07 Jun 2017 03:55:40 CEST):
> Hi, all,
>
> I'm kinda lost here. I have a perl script (call it xyz.pl) I need to
> call from ACL processing (SPAM handling). The script returns the number
> of days since the sending domain was registered or -1 if it can't be
> determined.


"returns"? That is "writes to stdout", right?

For experimenting I recomming using

        exim -be '${run{/path/to/command param…}{A}{B}}'


Where "A" and "B" are expanded depending on the exit status of the
command. The string $value may be used there and contains the merged
stdout/stderr from the command.

Note, that the environment is *empty* (as if you call your program `env
-i program`), even $PATH isn't set there!

(See keep_environment, add_environment options for ways to change this.)

To ease writing you may set a MACRO:

    DAYS_REGISTERED = ${run{/path/to/command $sender_address_domain}{$value}}



    begin acl


        …
        deny   condition = ${if <{DAYS_REGISTERED}{7}}


------

But, if you have it in a perl script already, you may want to use Exim's
builtin Perl capabilities. (I suppose, you wrote a Perl module,
having a days_registered() subroutine in @EXPORT_OK)


    perl_startup = use My::Module qw(days_registered);


    DAYS_REGISTERED = ${perl{days_registered}{$sender_address_domain}}


    # ACL as above


The use of the MACRO is to improve the readability only.
The use of the perl_startup doesn't give you any benefit here, except
readability and a cleaner interface. In case you need to call more Perl
scripts/functions, you get a performance gain, since the Perl
interpreter gets loaded only once.

As long as you do not reach the ${perl…} part of the configuration,
there is no performance hit, since Exim delays loading of Perl until
it's needed.

> I have the script working, but having trouble figuring out how to call
> it from Exim and handle the return code. And the more I go through the
> docs, the more confused I get - Exim is just too powerful!


Uhm… The return code?

You return the number of days as return code? What if the domain is
registered for >254 days?

I'd send the days to stdout, using the return code only to indicate some
error!

    Best regards from Dresden/Germany
    Viele Grüße aus Dresden
    Heiko Schlittermann
-- 
 SCHLITTERMANN.de ---------------------------- internet & unix support -
 Heiko Schlittermann, Dipl.-Ing. (TU) - {fon,fax}: +49.351.802998{1,3} -
 gnupg encrypted messages are welcome --------------- key ID: F69376CE -
 ! key id 7CBF764A and 972EAC9F are revoked since 2015-01 ------------ -