我被要求解决从已失效的旧服务器中恢复电子邮件备份的情况。
有了 Maildir 文件和一些标头数据,我可以通过一些侦探工作轻松确定服务器用于运行 postfix+dovecot 的组合,这与我所说的 postfix+courier 相反。
因此,我使用 Postfix 3.1.6 和 dovecot-imapd 2.2.27 设置了 Debian 9 服务器。
经过几次调整后,我们已经看到了文件夹,但电子邮件看起来是乱码。
检查 cur 和 new 目录,电子邮件文件看起来是正常的 Maildir 格式,但是打开它们似乎是乱码。
运行命令file
发现消息都是 gzip 压缩格式。
这里发生了什么,我是否获得了管理员在备份之前压缩所有电子邮件箱消息文件的备份?
答案1
当我进一步探索这个主题时,我明显感觉到有些地方不对劲。
我的怀疑也变得更加严重,因为当解压一些消息时,当 dovecot 看到它们时,名称实际上已经更新以反映新的更大的尺寸。
于是经过进一步调查,发现鸽舍可以有压缩的地方。
我刚刚发现压缩可以应用于 Dovecot 邮件存储。
请注意,压缩仅适用于“新”电子邮件。
将其添加到 /etc/dovecot/conf.d/10*
# Enable zlib plugin globally for reading/writing: mail_plugins = $mail_plugins zlib # Enable these only if you want compression while saving: plugin { zlib_save_level = 6 # 1..9; default is 6 zlib_save = gz # or bz2, xz or lz4 }
将其添加到 /etc/dovecot/conf.d/20*
protocol imap { mail_plugins = zlib } protocol pop3 { mail_plugins = zlib }
重新启动服务dovecot
:
service dovecot restart
然后,压缩设置将应用于配置更改后创建的所有消息。
有关于的指示Dovecot WiKi(Zlib 插件)这将帮助您压缩已存储的电子邮件。
Zlib 插件可用于读取压缩的 mbox、maildir 或 dbox 文件。它还可用于将压缩消息写入(通过 IMAP、LDA 和/或 LMTP)到 dbox 或 Maildir 邮箱。 Zlib 插件支持使用 zlib/gzip、bzlib/bzip2、liblzma/xz (v2.2.9+) 和 liblz4/lz4 (v2.2.11+) 进行压缩。
......
邮件目录
加载此插件后,Dovecot 可以从 Maildir 读取压缩和未压缩文件。如果您启用了 gzip 和 bzip2 支持,则可以在 Maildir 中使用其中任一压缩文件。通过读取文件的前几个字节并确定它是否是有效的 gzip 或 bzip2 标头来检测压缩。文件名并不重要。
或者,由于性能原因不想处理压缩邮箱,批量解压缩它们的方法之一是编写 bash 脚本。
当前的脚本有一些缺点,但总体指导原则是:
#!/bin/bash
TMPDIR="/tmp"
service dovecot stop
find /home/*/Maildir -type f |
while read file
do
file "$file" | grep gzip > /dev/null
if [ $? -eq 0 ]
then
echo "$file"" gzipped...decompacting"
mv "$file" $TMPDIR/$$.gz
gunzip -c $TMPDIR/$$.gz > "$file"
rm -f $TMPDIR/$$.gz
fi
done
find /home -name "dovecot.index.cache*" -delete
service dovecot start