使用 dovecot 压缩旧电子邮件

使用 dovecot 压缩旧电子邮件

我如何配置 dovecot 来压缩/存档旧电子邮件(比如说 6 个月前的)并且用户仍然可以阅读它们,从而节省服务器上的宝贵空间?

答案1

压缩电子邮件的配置分为两步:

  1. 我们需要配置 dovecot 才能读取压缩邮件
  2. 我们需要设置一个 cronjob 来压缩电子邮件

Dovecot 配置

创建 dovecot 的配置文件以启用 zlib 插件

Dovecot 配置文件通常位于/etc/dovecot/conf.d/

您可以在此目录中创建一个名为的文件,35-zlib.conf内容如下

# Enable Zlib for imap
protocol imap {
  mail_plugins = $mail_plugins zlib
}
# Enable Zlib for pop3
protocol pop3 {
  mail_plugins = $mail_plugins zlib
}
# Increase memory allowed for imap as it costs more to read compressed files
service imap {
  vsz_limit = 1024MB
}

确保您的配置正确doveconf -n,然后使用重新启动 dovecotservice dovecot restart

每日计划任务

接下来我们需要每天运行一个脚本来压缩超过 6 个月的电子邮件

希望这可以通过[详细]查找命令

创建/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 "${FULLPATH}" | grep compressed -q; then
      mv "${FULLPATH}" "${FULLPATH}Z" # Already compressed
    else
      BASENAME=$(basename "${FULLPATH}")
      cp -a "${FULLPATH}" "/tmp/${BASENAME}" # Move to tmp
      gzip -f "/tmp/${BASENAME}" # Compress
      if [[ -f ${FULLPATH} ]]; then # Make sure the original file has not been deleted while we were compressing
        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 标志以表明它们已被压缩,因此我们不会再次对它们进行 gzip 压缩,最后删除原始文件

这一进程是根据鸽舍 维基maildirlock实用性有一个错误自 v2 以来,这个问题从未得到修复,所以我没有使用它,但它不太可能导致问题

我们还将所有成功归档的文件记录在/var/log/archived-emails.log

您可以先在终端中运行该命令(无需 exec),以确保匹配正确的文件

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

相关内容