将 dovecot 升级到 2.1.7 (wheezy) 后,邮箱索引文件似乎损坏了。通常,dovecot 应该会自动修复它们,但由于 zlib 压缩,它无法确定正确的邮件大小。
Error: Corrupted index cache file ...
Input/output error (FETCH for mailbox INBOX UID ...
Maildir filename has wrong S value ...
现在我想完全禁用 zlib 插件并解压现有消息。使用 dsync 的尝试失败,因为 dsync 根本不解压它们。
有什么建议可以解决它吗?
答案1
#!/bin/bash
IFS=$'\n'
for i in $(find /var/vmail -type f); do
if file "$i" |grep gzip >/dev/null; then
# echo "Extracting GZIP:" "$i"
mv "$i" "$i".gz
gunzip "$i".gz
elif file "$i" |grep bzip2 >/dev/null; then
# echo "Extracting BZIP2:" "$i"
bunzip2 -q "$i"
mv "$i".out "$(echo $i |sed 's/.out//')"
fi
done
答案2
就我而言,邮件大小由文件名中的“,S=12345”属性决定。他们提供了一个 Perl 脚本,可以递归扫描一个或多个邮件目录,并可以选择提取 zlib 压缩文件,确定实际邮件大小,并将其写入文件名中。
我指的是在这里找到的信息: https://www.dovecot.org/list/dovecot/2013-January/087953.html
该脚本可从以下网址获取: https://www.dovecot.org/tools/maildir-size-fix.pl
(编辑:此处镜像 v1.1,以防此链接离线):https://tubemail.de/maildir-size-fix.pl.txt)
您可能必须更改脚本中的某些配置变量或确定哪些参数可用 - 至少我自己没有找到有关脚本用法的文档,但脚本开头的配置相当容易理解。
对我来说,它就像魔法一样有效,到目前为止没有发现任何缺陷。
编辑:命令行使用参数位于配置变量后面的注释中。因此,要扫描 maildir/home/myuser/.maildir/
并更正所有邮件大小,您必须运行
./maildir-size-fix.pl -a -f -c -r /home/myuser/.maildir/
where
-a
如果缺少则添加尺寸-f
如果尺寸不对,请更正-c
检查文件是否被压缩,如果是,则提取文件以确定正确的大小-r
告诉脚本递归运行所有子文件夹
您需要安装gunzip
和bunzip2
二进制文件才能使后者工作;此外,cat
还wc
需要awk
安装、和,所有主流 Linux 发行版都应该如此。