Tof*_*del 4 email compression dovecot gzip
如何配置 dovecot 来压缩/存档旧电子邮件(例如 6 个月前的电子邮件),同时用户仍然能够阅读它们,以节省服务器上的一些宝贵空间?
压缩电子邮件的配置分为两步:
为 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
}
Run Code Online (Sandbox Code Playgroud)
确保您的配置正确doveconf -n
,然后使用重新启动 dovecotservice dovecot restart
接下来我们需要每天运行一个脚本来压缩超过 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 "${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
Run Code Online (Sandbox Code Playgroud)
不要忘记运行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 并最终删除原始文件这个过程是根据dovecot wiki的指导方针实现的,但该
maildirlock
实用程序自 v2 以来有一个错误,从未修复过,所以我没有使用它,但它不太可能导致问题我们还将所有成功归档的文件记录在
/var/log/archived-emails.log
您可以先在终端中运行该命令而不使用 exec 以确保匹配正确的文件
find /var/qmail/mailnames -mtime +182 -type f -regex ".*\.$HOSTNAME,.*S=.*,[a-yA-Y]*" ! -name "*\.gz*"