Сжать старые электронные письма с помощью Dovecot

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

Как я могу настроить dovecot для сжатия/архивирования старых писем (скажем, старше 6 месяцев), чтобы пользователи все еще могли их читать и тем самым сэкономить драгоценное место на сервере?

Настройка сжатия писем — это процесс из двух этапов:

  1. Нам нужно настроить dovecot для чтения сжатых писем
  2. Нам нужно настроить cronjob для сжатия писем

Настройка Dovecot

Создайте файл конфигурации для dovecot, чтобы включить плагин zlib

Файлы конфигурации Dovecot обычно находятся в /etc/dovecot/conf.d/

Вы можете создать файл с именем 35-zlib.conf в этом каталоге с таким содержимым

# Включить Zlib для imap
protocol imap {
  mail_plugins = $mail_plugins zlib
}
# Включить Zlib для pop3
protocol pop3 {
  mail_plugins = $mail_plugins zlib
}
# Увеличить разрешенную память для imap, так как чтение сжатых файлов стоит дороже
service imap {
  vsz_limit = 1024МБ
}

Убедитесь, что ваша конфигурация правильная, с помощью doveconf -n, затем перезапустите dovecot, используя service dovecot restart

Ежедневный cronjob

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

Надеюсь, это можно сделать с помощью [verbose] команды find

В /etc/cron.daily/ создайте файл, давайте назовем его archive-email

Запишите этот скрипт в него

#!/bin/bash
find /var/qmail/mailnames -mtime +182 -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" ! -name "*\.gz*" -print0 |
 while read -rd $'\0' FULLPATH
  do
    echo "${FULLPATH}"
    if file -b "${FULLPATH}" | grep -q compressed; then
      mv "${FULLPATH}" "${FULLPATH}Z" # Уже сжато
    else
      BASENAME=$(basename "${FULLPATH}")
      cp -a "${FULLPATH}" "/tmp/${BASENAME}" # Перемещение во временную папку
      gzip -f "/tmp/${BASENAME}" # Сжатие
      if [[ -f ${FULLPATH} ]]; then # Убедитесь, что исходный файл не был удален во время сжатия
        mv "/tmp/${BASENAME}.gz" "${FULLPATH}Z" && rm "${FULLPATH}"
      else
        rm "/tmp/${BASENAME}.gz"
        continue
      fi
    fi
    echo "${FULLPATH}" >> /var/log/archived-emails.log
  done

Не забудьте выполнить chmod +x на созданном файле, чтобы сделать его исполняемым

/var/qmail/mailnames обычно является корневой папкой, в которой хранятся письма, но это может зависеть от вашей конфигурации

Модификатор -mtime +182 позволяет нам находить только файлы, созданные более 182
дней назад (по сути, 6 месяцев), измените его соответствующим образом

С модификатором -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" мы хотим найти только файлы писем, которые не имеют флага Z, которые обычно называются в таком формате
1505740244.M351559P24632.my.domain.com,S=38204,W=40910:2,S
Дополнительную информацию о формате maildir можно найти здесь

В конце концов, мы копируем письма для сжатия в каталог \tmp, чтобы избежать конфликтов во время сжатия, мы выполняем команду gzip на файле и перемещаем их снова, если файл все еще существует в своем исходном местоположении, добавляя флаг Z в их имя, чтобы указать, что они сжаты, чтобы мы не сжимали их снова, и в конце удаляем исходный файл

Этот процесс был реализован в соответствии с рекомендациями dovecot wiki, но утилита maildirlock имеет ошибку с версии 2, которая никогда не была исправлена, поэтому я не использую ее; однако вряд ли это вызовет проблемы

Мы также записываем все успешно архивированные файлы в /var/log/archived-emails.log

Вы можете сначала запустить команду в своем терминале без exec, чтобы убедиться, что вы находите правильные файлы

find /var/qmail/mailnames -mtime +182 -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" ! -name "*\.gz*"

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

Сжатие старых писем с помощью Dovecot

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

1. Конфигурация Dovecot

Для начала необходимо настроить Dovecot для поддержки чтения сжатых писем. Вам нужно будет установить плагин zlib в конфигурацию вашего Dovecot.

Шаги по настройке:

  1. Скорее всего, файлы конфигурации Dovecot находятся в директории /etc/dovecot/conf.d/. Создайте новый конфигурационный файл, например, 35-zlib.conf, и добавьте в него следующий код:

    # Включить Zlib для IMAP
    protocol imap {
     mail_plugins = $mail_plugins zlib
    }
    # Включить Zlib для POP3
    protocol pop3 {
     mail_plugins = $mail_plugins zlib
    }
    # Увеличить лимит памяти для IMAP, так как чтение сжатых файлов требует большего объема памяти
    service imap {
     vsz_limit = 1024MB
    }
  2. После внесения изменений проверьте корректность конфигурации с помощью команды:

    doveconf -n
  3. При отсутствии ошибок перезапустите службу Dovecot, чтобы изменения вступили в силу:

    service dovecot restart

2. Настройка задачи cron для сжатия писем

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

Шаги по созданию задачи cron:

  1. В директории /etc/cron.daily/ создайте файл, назовите его, например, archive-email, и добавьте в него следующий скрипт:

    #!/bin/bash
    find /var/qmail/mailnames -mtime +182 -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" ! -name "*\.gz*" -print0 |
    while read -rd $'\0' FULLPATH
    do
     echo "${FULLPATH}"
     if file -b "${FULLPATH}" | grep -q compressed; then
       mv "${FULLPATH}" "${FULLPATH}Z" # Уже сжато
     else
       BASENAME=$(basename "${FULLPATH}")
       cp -a "${FULLPATH}" "/tmp/${BASENAME}" # Копируем во временную директорию
       gzip -f "/tmp/${BASENAME}" # Сжимаем
       if [[ -f ${FULLPATH} ]]; then # Проверяем, что оригинальный файл не был удален во время сжатия
         mv "/tmp/${BASENAME}.gz" "${FULLPATH}Z" && rm "${FULLPATH}"
       else
         rm "/tmp/${BASENAME}.gz"
         continue
       fi
     fi
     echo "${FULLPATH}" >> /var/log/archived-emails.log
    done
  2. Не забудьте сделать скрипт исполняемым, используя команду:

    chmod +x /etc/cron.daily/archive-email

Примечания:

  • Путь /var/qmail/mailnames является типичным местом хранения писем, но вы можете изменить его в зависимости от вашей конфигурации.
  • Модификатор -mtime +182 позволяет находить файлы, созданные более 182 дней назад (это соответствует примерно 6 месяцам). Вы можете изменять этот параметр по необходимости.
  • Шаблон с использованием -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" позволяет находить только те файлы, которые не были сжаты, и имеет специфическую структуру именования.
  • Вместо того чтобы сжимать письма сразу, скрипт временно копирует их в /tmp, что позволяет избежать конфликтов, и только после успешного сжатия перемещает их обратно с добавлением флага Z, чтобы указать на сжатие.

Заключение

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

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

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