Автоответчик в postfix

    Приветствую читателей сего сайта.

    Тема, которую я собираюсь поднять, здесь не нова, но, может быть, кому-то поможет.

    Итак…

    Дано:
    1. Настроенный postfix+cyrus-imap+sasl2. Почтовый сервер обслуживает 3 домена (domain1.ru, domain2.ru, domain3.ru)

    Задача:
    Сделать «автоответчик» отправителю. То есть, если получатель письма на больничном и ему приходит письмо, то письмо должно оказаться в его же ящике, а отправителю должен быть ответ что, мол, «Иванов на больничном, по всем вопросам обращаться к Петрову».

    Сразу скажу, что информация о том, как это сделать, в интернете есть, но я приведу решение, которое сделает автоответчик для каждого пользователя каждого же домена в отдельности.
    Я пробовал делать некий универсальный скрипт для этих целей, но в ходе испытаний пришел к выводу, что лучше сделать для каждого юзера свой скрипт.

    Решение:
    1. Создаем файл сообщения /etc/postfix/script/ivanov@domain1.ru.msg с содержимым:
    Добрый день. С 01.01.2016 по 15.01.2016 я буду на больничном, по всем вопросам обращаться по телефону 3432142345435. Спасибо.

    2. /etc/postfix/master.cf добавляем следующее
    autoreply_ivanov_domain1
            unix    -       n       n       -       -       pipe
            flags=F user=nobody   argv=/etc/postfix/script/autoreply_ivanov_domain1 ${sender} ${recipient}


    3. /etc/postfix/main.cf добавляем
    virtual_alias_maps = hash:/etc/postfix/virtual_alias_maps
    transport_maps = hash:/etc/postfix/transport


    4. /etc/postfix/transport
    
    ivanov.autoreply.domain1.ru     autoreply_ivanov_domain1:
    
    # здесь мы определяем транспорт для несуществующего домена ivanov.autoreply.domain1.ru. Домен этот нужен для того что бы однозначно определить юзера в определенном домене.


    5. /etc/postfix/virtual_alias_maps
    
     ivanov@domain1.ru ivanov@domain1.ru, ivanov@domain1.ru@autoreply@ivanov.autoreply.domain1.ru
    # здесь мы указыаем что пришедшую почту на  ivanov@domain1.ru надо доставить ему же и на ящик autoreply@ivanov.autoreply.domain1.ru(домен которого будет обслуживаться по правилам указанным в master.cf согласно транспорту указанному в transport)


    6. Готовим скрипт ответа на сообщение:
    /etc/postfix/script/autoreply_ivanov_domain1 с содержимым
    #!/bin/bash
    1. sender=`echo $1`
    2. recipient=`echo $2`
    3. name1=`echo $recipient | cut -d @ -f 1`
    4. name2=`echo $recipient | cut -d @ -f 2`
    5. name=`echo $name1@$name2`
    6. text=`cat /etc/postfix/script/$name.msg`
    7. /etc/postfix/script/sendEmail/sendEmail -o tls=no -f "REPLY <autoreply@domain1.ru>" -t $sender -u reply -o message-charset=utf-8 -m $text -s 192.168.1.1  -xu autoreply@domain1.ru -xp "111"
    
    # пояснение. Цифры номеров строк надо конечно же удалить.


    1-2. Присваиваем переменным значения других переменных, полученных от postfix. Эти переменные окажутся здесь вот из этой строки файла master.cf argv=/etc/postfix/script/autoreply_ivanov_domain1 ${sender} ${recipient}
    3-4. Переменная recipient будет равна «ivanov@domain1.ru@autoreply@ivanov.autoreply.domain1.ru» и отсюда нам надо выдернуть «ivanov@domain1.ru»что мы и делаем. Сначала дергаем первое поле «ivanov »до первого разделителя а потом второе поле «domain1.ru»
    5. После выполнения этой строки переменная name будет иметь вид ivanov@domain1.ru.
    6. Переменной text присваивается значение содержимого файла ivanov@domain1.ru.msg
    7. Собственно посылаем ответ отправителю. Я думаю, с этой строкой все понятно, от кого, кому, что посылаем, через какой smtp, логин и пароль для ящика autoreply@domain1.ru, который, кстати, должен быть, естественно, создан.

    Чтобы сделать автоответчик для других юзеров/доменов — все то же самое, только надо правильно именовать файлы.

    Всем спасибо.
    Share post

    Comments 2

      +1
      Это рассчитано видимо на совсем маленький домашний сервер?
      А что со sieve не так?

      Вообще странный костыль… Для красоты тогда уж «лучше» написать демона и встроить его в цепочку обработки писем, завернуть все это в базу, сделать вебморду… или все таки использовать sieve :)
        0
        может быть и так. просто я привел пример где НЕ надо использовать ничего кроме самого postfix. а вообще вариантов много конечно, но с использованием вэбморд, БД, и т.д.

      Only users with full accounts can post comments. Log in, please.