Как сохранить все входящие и исходящие электронные письма в базе данных, одновременно сохраняя их в maildir?

Вопрос или проблема

Я настраиваю почтовый сервер с Postfix и Dovecot и хочу архивировать все входящие и исходящие электронные письма, вместе с их полной метаданными (отправитель, получатели, включая BCC и т.д.) и вложениями, в базе данных. Эти данные необходимо сохранять дополнительно к стандартной доставке в maildir Dovecot для регулярного доступа пользователей.

Вот мои проблемы:

Мне нужно точно зафиксировать всю информацию об отправителе и получателе. Решения, такие как архивация через always_bcc, не подходят, поскольку они пропускают письма, где используется BCC, что означает, что один из оригинальных адресов получателя не фиксируется, что имеет решающее значение для нашей документации.

Вот пример, когда пользователь отправляет письмо с To: [email protected], CC: [email protected] и BCC: [email protected] одновременно:

Received: from mail.server.com (unknown [192.168.1.10])
    by mx.server.com (Postfix) with ESMTPSA id F25EB67402;
    Fri, 25 Oct 2024 12:47:49
MIME-Version: 1.0
Date: Fri, 25 Oct 2024 12:47:49
From: [email protected]
To: User1 <[email protected]>
Cc: User2 <[email protected]>

Это также не сработает, если используется несколько BCC (нет To или CC):

Received: from mail.server.com (unknown [192.168.1.10])
    by mx.server.com (Postfix) with ESMTPSA id BCD7C6712F;
    Fri, 25 Oct 2024 12:54:07 +0330
MIME-Version: 1.0
Date: Fri, 25 Oct 2024 12:54:07
From: [email protected]
To: undisclosed-recipients:;
Subject: multiple bcc

Использование демон-политики не является идеальным, поскольку он не предоставляет доступ к фактическим данным электронной почты, только метаданным.

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

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

Ответ или решение

Для реализации задачи по архивированию всех входящих и исходящих писем на почтовом сервере с использованием Postfix и Dovecot, а также сохранению их в базе данных с полными метаданными (отправители, получатели, включая BCC) и вложениями, существует несколько подходов, которые можно рассмотреть.

1. Использование Postfix Milter

Milter (Mail Filter) является одним из наиболее подходящих решений для вашей задачи. Он позволяет обрабатывать почтовые сообщения на этапе их получения или отправки, что обеспечивает возможность захвата как метаданных, так и самих писем. Вот основные шаги для настройки такого решения:

A. Установка необходимого ПО

Для начала необходимо установить Milter, который будет использоваться для обработки сообщений. Наиболее распространённый выбор — Pigeonhole или MimeDefang.

sudo apt-get install sendmail-bin

B. Настройка Postfix для использования Milter

В конфигурационном файле Postfix (/etc/postfix/main.cf) добавьте следующие строки, чтобы включить ваш Milter:

smtpd_milters = unix:/var/run/milter.sock
non_smtpd_milters = unix:/var/run/milter.sock

C. Создание обработки писем

Ваша Milter должна принимать входящие и исходящие сообщения, а затем извлекать метаданные и содержимое. Вот пример кода на Python с использованием библиотеки milter:

from milter import Milter

class ArchiveMilter(Milter):
    def header(self, name, value):
        # Сохраняем заголовки в базе данных
        pass

    def eoh(self):
        # Завершаем сбор заголовков
        pass

    def body(self, chunk):
        # Сохраняем тело сообщения в базе данных
        pass

    def close(self):
        # Логика завершения
        pass

D. Настройка базы данных

Создайте структуру базы данных, например, с использованием PostgreSQL или MySQL, чтобы хранить письма и их метаданные. Пример таблицы может выглядеть так:

CREATE TABLE emails (
  id SERIAL PRIMARY KEY,
  from_address VARCHAR(255),
  to_address VARCHAR(255),
  cc_address VARCHAR(255),
  bcc_address VARCHAR(255),
  subject VARCHAR(255),
  body TEXT,
  received_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. Архивирование через Pipe

Как альтернатива Milter, вы также можете использовать конструкцию pipe в Postfix. Это метод позволяет направлять каждое сообщение в отдельный скрипт, который будет обрабатывать сообщение и сохранять все необходимые данные в базу.

A. Создание скрипта

Создайте Bash или Python скрипт, который будет заниматься записью информации в базу данных.

#!/bin/bash
# Archive script
while read line; do
    echo "$line" # Логика для записи в базу данных
done

B. Настройка Postfix для использования Pipe

Добавьте следующую строку в файл /etc/postfix/main.cf:

mydestination = yourmailserver.com, localhost
virtual_alias_maps = hash:/etc/postfix/virtual

И настройте файл /etc/postfix/virtual для указания, каким образом перенаправлять сообщения.

3. Задачи по надежности и производительности

Чтобы гарантировать отказоустойчивость и производительность системы:

  • Буферизация: Используйте очереди для обработки писем, а не обрабатывать их в реальном времени. Это уменьшит нагрузку на сервер.
  • Безопасность: Убедитесь, что доступ к базе данных защищен, особенно при хранении личной информации.
  • Мониторинг: Настройте систему мониторинга для отслеживания нагрузки и производительности вашего сервера.

Заключение

Использование Milter — наиболее эффективный и гибкий подход к решению вашей задачи, так как он позволяет обрабатывать и сохранять как метаданные, так и контент сообщений без потери производительности. Pipe тоже может быть подходящим решением, но требует дополнительной настройки для обработки данных. Убедитесь, что вы учитываете требования к безопасности и надежности вашего почтового сервера.

Оцените материал
Добавить комментарий

Капча загружается...