Контроль переписки в Postfix («большой брат» следит за тобой)

Январь, 31st 2010Рубрика: *NIX 57169
Подписаться на комментарии по RSS

Задача - требуется контролировать переписку определенных сотрудников (официальная версия - создать backup почтовой переписки с возможностью последующего просмотра). Другими словами необходимо, чтобы при отправке письма пользователем (например, user@mydomain.ru), доставлял его почту как обычно адресату, а также дублировал это письмо в определенный ящик (например, big_brother@mydomain.ru).

На первый взгляд задача довольно не простая, но как оказалось - всё довольно легко реализуется. Имеем - операционная система FreeBSD и почтовый сервер на базе Postfix. Вот какие возможности для решения этой задачи предоставляет нам Postfix:

  • always_bcc = address
  • Доставляет копии ВСЕХ сообщений (входящих и исходящих) на указанный адрес (поддерживается с Postfix v.2.1). Например, указав в /usr/local/etc/postfix/mail.cf строку always_bcc = backup@mydomain.ru можно сделать полный бэкап всей почты на адрес backup@mydomain.ru, вот только не повезет тому, кто это всё разгребать будет.

  • sender_bcc_maps = type:table и recipient_bcc_maps = type:table
  • Таблицы соответствия отправителя/получателя с адресами доставки копий сообщений (функция доступна в Postfix 2.1 и выше.) То что нам и нужно.

Рассмотрим 2 варианта реализации - на основе файлов (индексированных карт hash) и базы данных MySQL.

Способ с использованием индексированных hash карт

Мы можем контролиривать, что хотим получить в результате - копировать на определенный ящик только отправляемые пользователем сообщения или только входящие, а может и то и другое.

Для примера рассмотрим вариант копирования исходящих сообщений:

1. Создаем файл в каталоге /usr/local/etc/postfix/, содержащий записи о том с какого почтового адреса копировать почту и на какой отправлять копии - назовем его sender_bcc. Добавляем в него строчку в формате:

user@mydomain.ru backup@mydomain.ru
user2@mydomain.ru backup@mydomain.ru

2. Добавляем в main.cf строчку

sender_bcc_maps = hash:/usr/local/etc/postfix/sender_bcc

3. Обязательно создаем индексированный файл:

postmap /usr/local/etc/postfix/sender_bcc

4. Перезагружаем постфикс и любуемся копированием исходящей почты.

Аналогичные шаги нужно проделать для получения возможности копирования входящей почты. Вместо sender_bcc_maps следует использовать recipient_bcc_maps.

recipient_bcc_maps = hash:/etc/postfix/recipient_bcc

Внимание! После внесения изменений не забываем перестроить хэш:

postmap /usr/local/etc/postfix/recipient_bcc
postmap /usr/local/etc/postfix/sender_bcc

Способ с использованием MySQL

Подразумевается, что вы уже используете MySQL совместно с Postfix для хранения учетных записей, транспорта и т.д.

1. Создаем табличку bcc в вашей базе данных

CREATE TABLE bcc (
id int(10) unsigned NOT NULL auto_increment,
sender varchar(128) NOT NULL default '',
recipient varchar(128) NOT NULL default '',
copy varchar(128) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

2. в /usr/local/etc/postfix/ создаем файлы sender_bcc.cf и recipient_bcc.cf:

sender_bcc.cf

user = postfix_user
password = postfix_password
dbname = mail_database
query = SELECT copy FROM bcc WHERE sender = '%s'
hosts = 127.0.0.1

recipient_bcc.cf

user = postfix_user
password = postfix_password
dbname = mail_database
query = SELECT copy FROM bcc WHERE recipient = '%s'
hosts = 127.0.0.1

3. В main.cf добавляем строчки

sender_bcc_maps = mysql:/usr/local/etc/postfix/sender_bcc.cf
recipient_bcc_maps = mysql:/usr/local/etc/postfix/recipient_bcc.cf

4. Перезапускам Postfix для применения изменений. Изменения данных в таблице MySQL bcc применяются без перезапуска Postfix.

Избавляемся от дублирования сообщений bcc_maps

Чтобы не происходило дублирования почты при использовании bcc_maps в master.cf следует добавить строчку:

-o receive_override_options=no_address_mappings

В моём случае это выглядит так:

smtp      inet  n       -       n       -       -       smtpd
#AntiSPAM + DrWeb
    -o receive_override_options=no_address_mappings
    -o content_filter=kas3scan:127.0.0.1:9026

Напоследок - неплохая статья по настройке Postfix , хотя сам несколько иначе строил, но руки пока не доходят написать свою статью полностью. Хотя есть некоторые наработки, описания которых не встречал в сети.

Подписывайтесь на канал Яндекс.Дзен и узнавайте первыми о новых материалах, опубликованных на сайте.

Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.

Комментариев: 15

  1. 2010-02-12 в 20:08:37 | AndroiDev

    Большой брат всегда следит за тобой :)

  2. 2010-02-22 в 17:49:20 | S1ash

    Ммм.. Спасибо автору.. То что доктор прописал =)

  3. 2010-04-06 в 11:52:33 | Maver

    Спасибо автор, нужная вещь как раз искал реализацию!

  4. 2010-04-06 в 11:53:24 | Maver

    Только есть еще вопрос "Избавляемся от дублирования сообщений bcc_maps" это нужно прописывать для всех вариантов или только тем кто юзает MySQL

  5. 2010-04-28 в 12:09:16 | vladok

    попробовал настроить пересылку исходящих писем посредством hash. Возник вопрос:

    пересылка возможна на ящик из другого домена? или только на ящик в родном домене ? Заранее спасибо.

  6. 2012-08-22 в 13:52:16 | Dimon

    Значит, то что доктор прописал(2 способ), создаём табличку, и всё хорошо, тогда стоит немного подумать, 1. чтобы всё в кучу не валить, нам необходимо для каждого пользователя создать ящик backup, прописать его в 2 таблицы, в этом случае у нас все входящие-исходящие для данного письма будут валится в одну папку на сервере, свалочка получится, по хорошему для каждого пользователя надо будет создать дополнительно 2 почтовых ящика, user_backup_from и user_backup_to.. Нехорошо получается, геморно это, может кто расскажет, как будут ходить письма внутри домена? одно и то же письмо будет сохранено 2 раза? как то опять нехорошо... Может валить всё в кучу, отправлять логи postfix в mysql, потом на это всё хозяйство натянуть веб морду с возможностью выгрузки файлов в отдельный каталог по отдельному пользователю, зато ни таблиц, ни лишнего мусора и всегда удобно подглядеть, восстановить

  7. 2012-09-14 в 11:14:16 | Max

    А есть ли возможность делать исключения?

    Т.е. чтобы делались бекапы всей исходящей почты домена, кроме 2 ящиков.

  8. 2014-02-28 в 15:45:20 | vasil

    Подскажите а как может произойти дублирование, которое вы лечите редактированием master.cf?

  9. 2014-08-19 в 23:56:31 | serga370

    спасибо огромной за отключение дублирования

    -o receive_override_options=no_address_mappings

    очень помогло.

  10. 2016-03-23 в 19:46:41 | Evgeniy

    Мега респект!!!!!

    Потратил целый день на буржуйских форумах на решение проблемы с дублированием. Нигде ни слова про опцию, только вопросы как убрать дублирование и ни одного ответа!

    Спасибо огромное!

  11. 2016-06-15 в 02:56:52 | pmmap

    Пасибо

    еще немного докрутил свой сервер до того чего хочется

    жаль только не получается через MySQL организовать пересылку скажем входящих от одного пользователя нскольким а не одному

  12. 2016-08-04 в 08:43:17 | rusik

    Всем привет.

    Скажите есть ли возможность и как это реализовать. Допустим чтоб если письмо от pupkin@mail.ru пришло на andrey@mydomen.ru, то только тогда копия письма приходит большому брату.

  13. 2016-08-04 в 10:55:48 | dre@mer]]>avatar]]>

    Я так понял что вы хотите сделать копирование писем определенного отправителя на ящик одного из ваших пользователей. Можно конечно попробовать добавить этого отправителя в sender_bcc: pupkin@mail.ru backup@mydomain.ru

    Не знаю правда будет такое работать или нет, сейчас нет возможности проверить... но даже чисто теоретически это правило всё равно распространяется на всех пользователей вне зависимости кому отправлено сообщение, а не на кого-то конкретно. Возможно в новой версии postfix это как-то реализовано, нужно читать документацию.

  14. 2017-03-03 в 16:47:53 | Комментатор 136]]>avatar]]>

    Спасибо за статью!

    Последние версии PostfixAdmin поддерживают добавление адресов, на которые будет копироваться почта, однако письма приходят в двух экземплярах. После добавления:

    -o receive_override_options=no_address_mappings

    все работает, как положено!

  15. 2019-04-19 в 17:27:38 | Виталий

    Привет.

    А как в случай mysql сделать несколько получателей ?

ваш комментарий будет опубликован после проверки
на указанный адрес будет отправлено письмо с кодом активации. Вы можете настроить собственный профиль и стать активным участником или автором.