Dovecot gz 拖车有错误 CRC

Dovecot gz 拖车有错误 CRC

使用 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

总的来说,我是这样摆脱困境的。有人帮我写了一个脚本:

  1. 递归运行文件夹,确定文件是否被压缩。
  2. 如果文件是压缩文件,请解压并检查是否有错误。如果没有错误,请跳过。
  3. 如果文件有错误,它会将文件“按原样”解压到临时文件夹中,然后再次压缩并将其移回邮件文件夹。这有助于消除 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

相关内容