1 votes

Comment créer mon propre répondeur automatique simple pour Postfix avec des conditions personnalisées ?

Postfix/Dovecot

Je veux créer mon une simple coutume autorépondeur pour Postfix, en Python, par exemple. Je n'ai pas besoin d'un répondeur tiers prêt à l'emploi.

Je veux qu'il ait des conditions personnalisées telles que "réponse automatique seulement quand 'from == A' ou/et 'to == B' ou/et "il n'y a pas eu de réponse automatique à cet email aujourd'hui", etc....

J'ai découvert que je devais utiliser soit content_filter soit spawn dans master.cf. Pas milter, parce que milter est déclenché parce qu'un message a été placé dans une file d'attente, alors que j'aurai besoin de répondre automatiquement aux messages qui sont déjà passés. Probablement.

D'autres meilleures options ?

Comment mettre cela en œuvre ?

1voto

davidgo Points 5870

Je ne pense pas qu'il y ait un moyen simple (c'est-à-dire trivial) de faire cela, et il y a très probablement plusieurs solutions.

J'ai mis en place ce système pour mon système de messagerie (qui héberge un bon nombre de boîtes et de domaines) et il est relié à un CMS personnalisé (BLISS3) comme suit :

Ajouté à /etc/postfix/master.cf

autoresponder
        unix  -       n       n       -       -       pipe flags=Rq
    user=mailuser argv=/etc/postfix/scripts/autoresponder.php ${sender} ${recipient}

Cela exécutera mon script autoresponder.php, en analysant l'expéditeur et le destinataire. Vous pourriez écrire l'autorépondeur approprié en Python si vous préférez.

J'ai ensuite ajouté ce qui suit à /etc/postfix/transport

  .autoresponder autoresponder:

Cette commande déclenche le répondeur automatique en tant que transport approprié lorsque je renvoie une copie d'un courriel à un courriel spécial "user@domain.name.autoresponder". Si vous souhaitez faire cela à petite échelle, vous pouvez probablement remplacer ".autoresponder" par votre adresse électronique si vous n'avez pas besoin de conserver une copie de l'e-mail entrant.

Tout ce qui reste est le script de l'autorépondeur lui-même.

Mon script PHP se présente comme suit :

#! /usr/bin/php
<?php
    #########################################################################################
    # Davids Autoresponder for BLISS3.  This has been designed to query a database to pull
    # the message contents from.
    #########################################################################################

    # How frequently to resend messages, ie only send 1 message per person every period.
    # The idea of this is to prevent mail loops.

    $period='1 day';
    $dbconnection="mysql://username:password@127.0.0.1/mail";

    # We take the input, and strip off the ".autoresponder" part, revealing our actual address.
    $from=mysqli_real_escape_string(substr($argv[2],0,-14));
    $to=mysqli_real_escape_string($argv[1]);

    #########################################################################################

    include "/usr/share/php/adodb/adodb.inc.php";
    $ADODB_FETCH_MODE=ADODB_FETCH_ASSOC;
    $conn=ADONewConnection($dbconnection);

    $theargs=$argv[0]." ".$argv[1]." ".$argv[2]."\n";
    syslog (LOG_WARNING,"Called autoresponder - $theargs");

    # Check if the email is in our database of recently sent messages.   If not, add it.
    # If it is, do not resend.   Also do not send emails if from = to

    $sent=$conn->GetAll("select count(uid) from autoresponded where mailfrom='$from' and mailto='$to' and date > current_timestamp - interval '$period'");

    if ( $sent[0]['count'] < 1 and $from != $to )
    {
        $q=$conn->Execute("insert into autoresponded (date,mailfrom,mailto) values (current_timestamp,'$from','$to')");

        $messages=$conn->GetAll("select ar_subject, ar_body from virtual where mailfrom='".$from."'");

        # No point in sending if we don't have a message to send.
        if ($messages[0]['ar_subject'] != '' or $messages[0]['ar_body'] != '')
        {
            $headers='From: '.$from."\r\n";
            $subject=pg_unescape_bytea($messages[0]['ar_subject']);
            $message=pg_unescape_bytea($messages[0]['ar_body']);
            mail ($to, $subject, $message,$headers);
        }
    }

    # Automatically clean up after ourself.
    $cleanup=$conn->Execute("delete from autoresponded where date < current_timestamp - interval '$period'");

Comme vous pouvez le voir, j'utilise une simple base de données pour garder la trace de la date à laquelle un courriel a été envoyé pour la dernière fois à une adresse donnée. Je vérifie que je n'envoie pas plus d'une réponse par expéditeur et par jour afin d'éviter les boucles de courrier et autres désagréments. L'envoi de l'email de réponse est effectué par une simple commande mail (6ème ligne).

Au cas où vous voudriez faire quelque chose de très similaire, le schéma de ma table de réponses automatiques est le suivant :

                                        Table "public.autoresponded"
  Column  |            Type             | Collation | Nullable |                  Default                   
----------+-----------------------------+-----------+----------+--------------------------------------------
 uid      | integer                     |           | not null | nextval('autoresponded_uid_seq'::regclass)
 date     | timestamp without time zone |           |          | now()
 mailfrom | character varying           |           |          | 
 mailto   | character varying           |           |          | 

Les lignes faisant référence à ar_header et ar_body tirent l'en-tête et le corps du répondeur automatique appropriés d'une base de données. Vous pouvez créer/modifier vos propres tables pour faire cela ou les coder en dur.

Nous espérons que ce qui précède vous donne un point de départ solide pour faire ce que vous voulez. Conformément au commentaire de @TobiM ci-dessous, utilisez ceci comme base pour votre code - vous devriez probablement remplacer le sql par des déclarations préparées. Je n'ai pas réellement vérifié que la version modifiée fonctionne, et elle suppose une base de données mysql.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X