使用 dovecot+exim4+roundcube 安装了 hestia。通过添加设置 gzip
zlib_save = gz
zlib_save_level = 6
在配置中。
在 imap conf 中添加了加载模块。我使用 thunderbird 阅读和发送消息,但 maildir 中的某些消息已损坏,thunderbird 无法完成下载已发送文件夹。
read /path/to/message failed. gz trailer has wrong CRC value at 8192 (read reason=mail stream)
更新:是的,只有 dovecot 写入目录(mozilla thunderbird 除外)。我用 gunzip -C 检查了一条消息,可以读取它,但在文件末尾附加了 png 图像,当我这样做时
gunzip -c /home/$$$/.Sent/cur/1664802400.M298227P1667779.<mydomain>,S=6509045:2,S
我在开头看到部分消息如下:
Content-Type: multipart/mixed; boundary="------------egJdRmaVhjH2gk4jyDoim1xN"
Message-ID: <$$$>
Date: Mon, 3 Oct 2022 16:06:17 +0300
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101
Thunderbird/91.13.1
Subject: =?UTF-8?B?UmU6INGC0LDQsdC70LjRhtCwINC6INC30LDQv9C+0LvQvdC10L3QuNGO?=
=?UTF-8?B?INGB0LXQvdGC0Y/QsdGA0YwgMjAyMg==?=
Content-Language: ru
To: Marina Nikitina <M*ru>
References: <[email protected]>
From: =?UTF-8?B?0JrQsNGI0YLQsNC90L7QstCwINCQ0L3QsNGB0YLQsNGB0LjRjyDQrtGA0Yw=?=
=?UTF-8?B?0LXQstC90LA=?= <*>
In-Reply-To: <*>
This is a multi-part message in MIME format.
--------------egJdRmaVhjH2gk4jyDoim1xN
Content-Type: multipart/alternative;
boundary="------------88BmI04frXCThbnk1baIR4WJ"
--------------88BmI04frXCThbnk1baIR4WJ
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
以及末尾附加的 png 的 base64 代码。最后是这个错误:
gzip: /home/$$$/.Sent/cur/1664802400.M298227P1667779.<mydomain>,S=6509045:2,S: invalid compressed data--format violated
更新:我认为我的问题是尝试将文件夹和消息从 mozilla thunderbird 移动到 dovecot 中,而不是本地移动。但是我现在该如何修复它?我尝试移动损坏的消息,但主要问题是 dovecot 仅记录第一条损坏的消息。移动后,我必须删除索引文件并等待找到下一条损坏的消息。
答案1
总的来说,我是这样摆脱困境的。有人帮我写了一个脚本:
- 递归运行文件夹,确定文件是否被压缩。
- 如果文件是压缩文件,请解压并检查是否有错误。如果没有错误,请跳过。
- 如果文件有错误,它会将文件“按原样”解压到临时文件夹中,然后再次压缩并将其移回邮件文件夹。这有助于消除 dovecot 的错误,现在邮件客户端可以正常工作。有些邮件可能无法读取,但这对我和存储在文件夹中的损坏邮件来说影响不大。无论如何,无法对它们做其他事情。也许下一个脚本将来会对某些人有用。
#/bin/sh
MAIL_DIR='/home/user/mail/domain/'
BACKUP_DIR='/home/user/broken'
TMP_FILE='/tmp/dovecot_move_broken.tmp'
[ -e "$BACKUP_DIR" ] || mkdir -p "$BACKUP_DIR" || exit 1
find "$MAIL_DIR" -iname '[0-9]*.M*.*' -printf '%s:%p\n'| while IFS="" read -r p; do
size=${p%%:*}
file=${p#*:/home/}
path=${file%/*}
file=${file##*/}
# пропускаем файлы размер которых равен указанному в флагах
[ "${file%,S=$size,*}" != "$file" ] && continue
# пропускаем файлы распакованные без ошибок
gunzip -c "/home/$path/$file" 2>/dev/null >"$TMP_FILE" && rm "$TMP_FILE" && continue
# пропускаем если файл не был сжат (пустой выходной файл)
[ -s "$TMP_FILE" ] || continue
echo "$path/$file"
dir="$BACKUP_DIR/$path"
[ -e "$dir" ] || mkdir -p "$dir"
# копируем файл в бэкап, затем записываем в него заново сжатые данные
cp -p "/home/$path/$file" "$BACKUP_DIR/$path/" && cat "$TMP_FILE" | gzip >"/home/$path/$file"
rm "$TMP_FILE"
done