URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 91750
[ Назад ]

Исходное сообщение
"ошибка при получении почты"

Отправлено Дмитрий , 12-Июн-11 01:33 
Здравствуйте, помогите пожалуйста решить проблему.

На сервере установлен Exim и Dovecot.

Новая почта, которая приходит, автоматически падает  в один и тот же файл: /var/spool/mail/sairus  

При получении почты, dovecot ругается: Couldn't open INBOX: Internal error occurred. Refer to server log for more information.

В логах тоже ничего не понятно:

dovecot: Jun 12 00:21:38 Error: POP3(sairus): stat(/var/spool/mail/sairus/cur) failed: Not a directory
dovecot: Jun 12 00:21:38 Error: POP3(sairus): Couldn't open INBOX: Internal error occurred. Refer to server log for more information. [2011-06-12 00:21:38]

В конфиге dovecot.conf

прописано:
mail_location = maildir:/var/spool/mail/%u


Обьясните, почему ругается dovecot, а также почему вся почта падает в один файл и где именно настраивается, чтобы в разные директории.


Очень надеюсь на вашу помощь, т.к. больше почерпнуть информации просто не откуда.


Содержание

Сообщения в этом обсуждении
"ошибка при получении почты"
Отправлено Дмитрий , 12-Июн-11 01:47 
заменил

mail_location = maildir:/var/spool/mail/%u


на

default_mail_env = mbox:/var/mail/%u:INBOX=/var/mail/%u:INDEX=/var/mail/%u


Создались папки cur new и tmp в папке /var/spool/mail, ошибку не выдает.

команда list (через телнет)
list
+OK 0 messages:

Собственно как связать exim с dovecot чтобы один писал в папку определенную, а второй оттуда читал.


"ошибка при получении почты"
Отправлено DeadLoco , 12-Июн-11 10:03 
> Собственно как связать exim с dovecot чтобы один писал
> в папку определенную, а второй оттуда читал.

МТА занимается маршрутизацией почт, и локальное деливери - не его ума дело. Экзим умеет класть почту в локальный ящик (LDA), но гораздо правильнее эту работу поручить довекоту, которому потом эту почту читать.

Заведите отдельного безлогинного юзера в системе, которому будет принадлежать вся почта. Например, postman с уидом=20000 и гидом=20000

В конфиг экзима добавьте транспорт:

dovecot_lda:
        driver          = pipe
        command         = /usr/local/libexec/dovecot/deliver -d $local_part@$domain -f $sender_address
        user            = postman
        log_output

В роутере, обрабатывающем локальную почту, пропишите транспортом довекот_лда.
В конфиге довекота прописываем статический юзердб:
userdb static {
       args = uid=postman gid=postman home=/var/mail/%d/%n
}

Все. С этого момента экзим для укладки в ящики будет отдавать письма довекоту, который будет их класть от имени postman и читать от него же.

Мейлдирам самое место в вар/мейле:
mail_location = maildir:/var/mail/%d/%n
Каталог /var/mail должен быть с правами 777, довекот внутри сам создаст структуру уже с правами постмена.


"ошибка при получении почты"
Отправлено Дмитрий , 12-Июн-11 16:26 
Спасибо большое за обьяснение! Подобное видел, но не знал как это работает и зачем, благодаря Вам вроде бы разобрался.!

"ошибка при получении почты"
Отправлено DeadLoco , 12-Июн-11 18:09 
> Спасибо большое за обьяснение! Подобное видел, но не знал как это работает
> и зачем, благодаря Вам вроде бы разобрался.!

Статический юзердб - это простейший вариант. Можно из базы выдергивать данные, но при этом уид/гид подставлять нужные. У меня виртуальные юзеры лежат в мускле, там же хранятся квоты на ящики, статусы активности и прочая. А извлекаю я их вот так:

-----------------------------------------------------------------
userdb sql {
    args                = /usr/local/etc/dovecot/dovecot.sql
}
-----------------------------------------------------------------
user_query = SELECT `home`, 1000 AS `uid`, 1000 AS `gid`, \
    CONCAT("*:bytes=",quota) AS quota_rule \
    FROM `mailbox` WHERE `username` = '%n@%d' AND `active`='1'
-----------------------------------------------------------------

Идея та же: с майлдирами работает только довекот и только от одного юзера. Мануал довекота не рекомендует для этого использовать юзеров dovecot или dovenull, а предлагает завести совсем отдельного.


"ошибка при получении почты"
Отправлено dmitry_sairus , 13-Июн-11 00:24 
настроил так как подсказали, но после отправки приходит письмо от Mail Delivery System:

local delivery failed


Как я только не пробовал, что не подставлял, то ругается на права, то dovecot вырубается при проверке почты. А теперь письмо вот приходит.

Я вообще пытаюсь делать все в статике, база мне не нужна (мало пользователей - личная почта только)

Скажите, а можно связать dovecot так, чтобы он читал тот 1 файл, который по умолчанию создается в папке /var/mail с именем пользователя.

И если не трудно, подскажите что означает mbox, INBOX, INDEX в строчке:

mail_location = mbox:/var/mail/%n:INBOX=/var/mail/%n:INDEX=/var/mail/%n

Для чего они используются и какие значения должны быть.
Спасибо.


"ошибка при получении почты"
Отправлено dmitry_sairus , 13-Июн-11 01:01 
Наверное так будет проще: выложу конф файлы, а Вы уж пинайте меня за ошибки...

### DOVECOT CONF ###

base_dir = /var/run/dovecot/
protocols = imap pop3
listen = *

disable_plaintext_auth = no
shutdown_clients = yes
ssl_disable = yes

log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = mail

login_dir = /var/run/dovecot/login
login_user = dovecot

login_process_size = 64
login_process_per_connection = yes
login_processes_count = 3
login_max_processes_count = 64
login_max_connections = 100


login_greeting = I am ready, sir.

login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s

mail_location = maildir:/var/mail/%d/%n

first_valid_uid = 25
first_valid_gid = 0
umask = 0077


protocol imap {
}

protocol pop3 {
pop3_uidl_format = %08Xu%08Xv
}

protocol lda {
  postmaster_address = admin@****
  auth_socket_path = /var/run/dovecot/auth-master
}


auth default {
mechanisms = plain
   socket listen {
     master {
       path = /var/run/dovecot/auth-master
       mode = 0600
       user = mailnull
     }
   }

passdb passwd-file {
    args = /etc/dovecot.passwd
   }

userdb static {
       args = uid=vmail gid=vmail home=/var/mail/%d/%n
}

user = root
}

plugin {

}

Фрагмент от
####EXIM####

begin routers

dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more


system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup{$local_part}lsearch{/etc/aliases}}
  file_transport = address_file
  pipe_transport = address_pipe

userforward:
  driver = redirect
  check_local_user
  file = $home/.forward
  allow_filter
  no_verify
  no_expn
  check_ancestor
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply

localuser:
  driver = accept
  check_local_user
  #transport = local_delivery
  transport = dovecot_delivery
  cannot_route_message = Unknown user


######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################


begin transports

remote_smtp:
  driver = smtp

local_delivery:
  driver = appendfile
  file = /var/mail/$local_part
  delivery_date_add
  envelope_to_add
  return_path_add
  group = mail

address_pipe:
  driver = pipe
  return_output

address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add
  mode = 0660

address_reply:
  driver = autoreply


dovecot_delivery:
  driver = pipe
  command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain
  message_prefix =
  message_suffix =
  delivery_date_add
  envelope_to_add
  return_path_add
  log_output
  user = vmail


"ошибка при получении почты"
Отправлено DeadLoco , 16-Июн-11 17:57 
> выложу конф файлы, а Вы уж пинайте меня за ошибки...
> Фрагмент от
> ####EXIM####
> dovecot_delivery:
>   driver = pipe
>   command = /usr/local/libexec/dovecot/deliver -d $local_part@$domain
>   user = vmail

Не хватает опции "-f $sender_address" в команде вызова.
Эта опция крайне важна, поскольку на этот адрес отправителю будут слаться баунсы, уведомления, автореплаи и т.д. Если ее не указать, то отправитель никогда не узнает, что при доставке в локальный ящик что-то не срослось.


"ошибка при получении почты"
Отправлено DeadLoco , 16-Июн-11 18:11 
> Скажите, а можно связать dovecot так, чтобы он читал тот 1 файл,
> который по умолчанию создается в папке /var/mail с именем пользователя.
> И если не трудно, подскажите что означает mbox, INBOX, INDEX в строчке:
> mail_location = mbox:/var/mail/%n:INBOX=/var/mail/%n:INDEX=/var/mail/%n

Существуют разные типы хранилищ, используемые для почтовых ящиков. Исторически самый древний - мейлбокс (mbox), когда все письма аппендятся в один файл с именем пользователя. При этом при большом количестве писем становятся очень большими накладные расходы на удаление писем и поиск письма в общей братской могиле. Для обхода затыков хранилища можно ставить костыли, вроде построения отдельного индекса. Но это костыли имени довекота, сам по себе мейлбокс никаких индексов не имеет.

Гораздо прогрессивнее мейлдир, когда вместо одного файла есть каталог, в котором каждое письмо хранится отдельным файлом. При этом появляется возможность структурировать каталог на подкаталоги, строить индексы для поиска и т.д. Это все уже входит в базовую конструкцию мейлдира, и отдельной настройки не требует. Правда, тогда возникает проблема множества мелких файлов, что усложняет тюнинг файловой системы и бекап. Но незначительно, по сравнению с выигрышем в остальном.

В общем, даже если на сервере не поднимается массовый почтовый сервис, а обслуживается всего 5-10-20 ящиков, мейлдир все равно предпочтительней мейлбокса. Если у вас все равно для кого-то из юзеров создается мейлбокс, значит у вас роутер довекот_лда находится после роутера, который этот мейлбокс создает.

Я практикую следующую схему роутинга: сначала идут все роутеры с редиректами (обработка алиасов), а затем - роутеры с аксептами (ЛДА), причем довекот_лда идет первым, а прочие выполняются лишь тогда, когда довекот не справился.