Dovecot сжимает существующие письма maildir из постфикса

Я взял фрагменты кода из других источников и создал скрипт для сжатия существующих электронных писем maildir (Dovecot нужно будет остановить, так как я не проверяю блокировки).

#!/bin/bash
store=/var/vmail/mydomain.com
find "$store" -type d -name "cur" | while read maildir; do

  tmpdir=$(cd "$maildir/../tmp" &>/dev/null && pwd) || exit 1

  find=$(find "$maildir" -type f -name "*,S=*" ! -name "*,*:2,*,*Z*" -printf "%f\n")
  if [ -z "$find" ]; then
    echo continue
    continue
  fi

  echo "$find" | while read filename; do

    if file "$maildir/$filename" | grep -q "SMTP mail, "; then

      echo 'Uncompressed' "$filename"

      flags=$(echo $filename | awk -F:2, '{print $2}')

      if echo $flags | grep ','; then
        newname=$filename"Z"
      else
        newname=$filename",Z"
      fi

      srcfile="$maildir/$filename"
      tmpfile="$tmpdir/$filename"
      dstfile="$maildir/$newname"

      gzip -c "$srcfile" > "$tmpfile" &&
      chown --reference="$srcfile" "$tmpfile" &&
      chmod --reference="$srcfile" "$tmpfile" &&
      touch --reference="$srcfile" "$tmpfile"

      if [ -f "$srcfile" ] && [ -f "$tmpfile" ]; then
        mv "$tmpfile" "$srcfile" &&
        mv "$srcfile" "$dstfile"
      else
        rm -f "$tmpfile"
      fi

    elif file "$maildir/$filename" | grep -q "gzip compressed data"; then
      echo 'Compressed' "$filename"
    else
      echo 'Unknown type'
    fi

  done
done

Однако я понял, что мою входящую почту не находят, так как не все электронные письма соответствуют критериям поиска -name "*,S=*".

Пример

find "/var/vmail/mydomain.com" -type d -name "cur" | while read maildir; do find "$maildir" -type f -name "*,S=*" ! -name "*,*:2,*,*Z*" -printf "%f\n"; done

Найдет эти:

/var/vmail/mydomain.com/Maildir/.Sent/cur
1580000001.M10001P10008.ip-172-1-1-100,S=14037,W=14302:2,Sa
1580000002.M20002P10009.ip-172-1-1-100,S=3784,W=3888:2,S

Однако не эти:

/var/vmail/mydomain.com/Maildir/.INBOX/cur
1580000003.Vca01I80f58M300003.ip-172-1-1-100:2,S
1580000004.Vca01I80de7M400004.ip-172-1-1-100:2,Sa
1580000005.Vca01I85252M400005.ip-172-1-1-100:2,RS
1580000006.Vca01I83ffeM400006.ip-172-1-1-100:2,Sb
1580000007.Vca01I8159aM400007.ip-172-1-1-100:2,RSa
1580000008.Vca01I84015M400008.ip-172-1-1-100:2,Sab

Я мог бы легко изменить команду поиска, чтобы она соответствовала входящей почте, но поскольку критерии поиска пришли откуда-то еще, я задался вопросом, была ли причина для явного "*,S=*"?

Пс. Обратите внимание, что почта не принимается через Dovecot, входящая почта обрабатывается postfix, который сохраняет почту непосредственно в соответствующем каталоге, переменные postfix ниже приведены для примера.

virtual_mailbox_base: /var/vmail
virtual_mailbox_maps: ldap lookup, %d/%u/Maildir/

person TSUK    schedule 22.04.2020    source источник


Ответы (1)


Вы можете поискать подстроку :2, в именах файлов.

Dovecot: расширения файлов Maildir

Стандартное определение имени файла: ":2,". […]
* ,S=: содержит размер файла. Получение размера из имени файла позволяет избежать использования stat(), что может повысить производительность. Это особенно полезно с квотой Maildir++.
* ,W=: содержит файл RFC822.SIZE, т.е. размер файла с переводом строки в виде символов CR+LF. […]

Прописные буквы обозначают «стандартные флаги», строчные буквы означают «локальные/пользовательские флаги».

person AnFi    schedule 22.04.2020
comment
Идеальный подробный ответ, изменение с -name ,S= на -name :2,, похоже, делает свою работу. - person TSUK; 23.04.2020