Как создать свой собственный простой автоответчик для Postfix с помощью пользовательские условия?

Postfix / Dovecot

Я хочу создать свой простой пользовательский автоответчик для Postfix, например, на Python. Мне не нужны сторонние готовые к использованию.

Я хочу, чтобы в нем были некоторые настраиваемые условия, такие как «автоответ только тогда, когда 'from == A' или / и 'to == B' или / и «сегодня это электронное письмо не было автоматически» и т. д.

Я обнаружил, что мне нужно использовать content_filter или spawn в master.cf. Не milter, потому что milter срабатывает, потому что сообщение было помещено в очередь, тогда как мне нужно будет автоматически отвечать на сообщения, которые уже прошли. Возможно.

Другие варианты получше?

Как это реализовать?

0
задан 20 October 2019 в 12:55
1 ответ

Я не думаю, что есть простой (т.е. тривиальный) способ сделать это, и, скорее всего, есть несколько решений.

Я реализовал это для моя почтовая система (в которой размещено изрядное количество ящиков и доменов) и подключается к настраиваемой письменной CMS (BLISS3) следующим образом:

Добавлено в /etc/postfix/master.cf

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

Это запустит мой скрипт autoresponder.php, разбирающий отправителя и получателя. Вы можете написать соответствующий автоответчик на python, если хотите.

Затем я добавил следующее в / etc / postfix / transport

  .autoresponder autoresponder:

Эта команда запускала автоответчик как соответствующий транспорт, когда я пересылал копию электронного письма на специальный (скрытый) адрес электронной почты. Если вы хотите сделать это в небольшом масштабе, вы, вероятно, можете просто заменить ".autoresponder" своим адресом электронной почты, если вам не нужно хранить копию входящего электронного письма.

Все, что осталось, - это сценарий автоответчика.

Мой сценарий PHP выглядит следующим образом:

#! /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="postgres://username:password@127.0.0.1/mail";

    # We take the input, and strip off the ".autoresponder" part, revealing our actual address.
    $from=substr($argv[2],0,-14);
    $to=$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'");

Как видите, я использую простую базу данных, чтобы отслеживать, когда в последний раз было отправлено электронное письмо на указанный адрес, который я проверяю, чтобы не отправлять больше затем 1 ответ на отправителя в день, чтобы предотвратить зацикливание почты и другие неприятности. Фактическое электронное письмо респондента создается с помощью простой почтовой команды (6-я последняя строка)

Если вы хотите сделать что-то очень похожее, схема для моей таблицы автоответчика:

                                        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           |           |          | 

Строки, относящиеся к ar_header и ar_body, извлекают соответствующий автоответчик заголовок и тело из базы данных. Вы можете создавать / изменять свои собственные таблицы для этого или жестко их кодировать.

Надеюсь, что приведенное выше дает вам надежную отправную точку для того, чтобы делать то, что вы хотите.

0
ответ дан 5 December 2019 в 00:20

Теги

Похожие вопросы