Dovecot для чайника, где берет %d

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-22 10:35:33

Зашел в тупик от незнания матчасти, прошу помощи.
Решил на базе OpenBSD45 поднять Exim+Dovecot+Postfixadmin. Чтоб разобраться в деталях, Exim запустил в режиме "абы заработал" а дотачивать - потом. С ним вроде вопросов нет, берет почту и кладет куда нужно. Postfixadmin все делает правильно. Dovecot тоже старается, но ... я не знаю, где он берет значение "%d" , когда к нему обращаюсь с клиента. Это значение постоянно пустое. Для полноты картины приведу конфиги (это отладочный вариант, чтоб разобраться)

exim

Код: Выделить всё

primary_hostname = serv.hbd
hide mysql_servers = localhost/exim/exim/exim
domainlist local_domains = ${lookup mysql{SELECT domain FROM domain WHERE \
			    domain='${domain}' AND active='1'}}

domainlist relay_to_domains = ${lookup mysql{SELECT domain FROM domain WHERE \
			    domain='${domain}' AND active='1'}}
hostlist   relay_from_hosts = localhost:127.0.0.0/8:192.168.0.0/24
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
allow_domain_literals = false
exim_user = _exim
exim_group = _exim
never_users = root
rfc1413_query_timeout = 0s
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d
helo_accept_junk_hosts = 192.168.0.0/24

begin acl
acl_check_rcpt:

  accept  hosts = :

  deny    message       = Restricted characters in address
          domains       = +local_domains
          local_parts   = ^[.] : ^.*[@%!/|]

  deny    message       = Restricted characters in address
          domains       = !+local_domains
          local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  accept  local_parts   = postmaster
          domains       = +local_domains

  require verify        = sender

  accept  hosts         = +relay_from_hosts
          control       = submission

  accept  authenticated = *
          control       = submission

  require message = relay not permitted
          domains = +local_domains : +relay_to_domains

  require verify = recipient
  accept

acl_check_data:

  accept

begin routers

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

system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup mysql{SELECT goto FROM alias WHERE \
	address = '${quote_mysql:$local_part@$domain}' OR \
	address = '${quote_mysql:@$domain}'}} 

dovecot_user:
  driver = accept
  condition = ${lookup mysql{SELECT goto FROM \
        alias WHERE address = '${quote_mysql:$local_part@$domain}' OR \
	address = '${quote_mysql:@$domain}'}{yes}{no}}
#  transport = dovicot_delivery
  transport = local_delivery    

begin transports

remote_smtp:
  driver = smtp

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

address_pipe:
  driver = pipe
  return_output

address_reply:
  driver = autoreply

begin retry
# Address or Domain    Error       Retries
# -----------------    -----       -------

*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h
begin rewrite
begin authenticators
Dovecot

Код: Выделить всё

protocols = pop3 pop3s
listen = *, [::]
disable_plaintext_auth = no
log_path = /var/log/dovecot.log 
info_log_path = /var/log/dovecot.log
log_timestamp = "%b %d %H:%M:%S "
ssl_disable = no
ssl_cert_file = /etc/ssl/dovecotcert.pem
ssl_key_file = /etc/ssl/private/dovecot.pem
ssl_parameters_regenerate = 12
#168
ssl_cipher_list = ALL:!LOW:!SSLv2
verbose_ssl = yes
#no
login_dir = /var/dovecot/login
login_user = _dovecot
login_process_size = 64
login_process_per_connection = yes
login_greeting = mailserver ready.
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s

mail_location = maildir:/var/mail/%d/%u
#exim/%d/%n
mail_debug = yes
mail_log_prefix = "%Us(%u): "
mail_log_max_lines_per_sec = 10
mmap_disable = yes
verbose_proctitle = yes
first_valid_uid = 521
mbox_write_locks = fcntl

protocol imap {
}
  
protocol pop3 {
  pop3_uidl_format = %08Xu%08Xv
  pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
}

protocol lda {
  postmaster_address = mastertron@serv.hbd
  auth_socket_path = /var/dovecot/auth-master
}

auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
auth default {
  mechanisms = plain
#  socket listen {
#    master {
#	path = /var/dovecot/auth-master
#	mode = 0600
#	user = mailnull
#       }	
#    }
  passdb sql {
    args = /etc/dovecot-mysql.conf
    }

  userdb sql {
    args = /etc/dovecot-mysql.conf
    }
  user = root
}

plugin {

} 
dovecot-sql

Код: Выделить всё

#!/bin/sh
## Dovecot-mysql configuration file
driver = mysql
connect = host=/var/run/mysql/mysql.sock dbname=exim user=dovecot password=assword
default_pass_scheme = CRYPT
password_query = SELECT password FROM mailbox WHERE name = '%n' AND active='1'
user_query = SELECT domain , 521 AS 'uid' , 521 AS 'gid' \
    FROM mailbox WHERE name = '%n'
#active ='1'
И вот лог:
dovecot: May 22 09:43:57 Info: dovecot v1.1.11 starting up
dovecot: May 22 09:43:58 Info: auth-worker(default): mysql: Connected to /var/run/mysql/mysql.sock (exim)
dovecot: May 22 09:43:58 Info: auth(default): new auth connection: pid=24897
dovecot: May 22 09:43:58 Info: auth(default): new auth connection: pid=21783
dovecot: May 22 09:43:58 Info: auth(default): new auth connection: pid=10387
dovecot: May 22 09:56:07 Info: ssl-build-param: SSL parameters regeneration completed
dovecot: May 22 10:23:33 Info: auth(default): new auth connection: pid=32335
dovecot: May 22 10:23:36 Info: auth(default): client in: AUTH 1 PLAIN service=pop3 lip=192.168.0.1 rip=192.168.0.2 lport=110 rport=1311 resp=
dovecot: May 22 10:23:36 Info: auth(default): client out: CONT 1
dovecot: May 22 10:23:36 Info: auth(default): client in: CONT 1 AGFkbWluAGFkbWlu
dovecot: May 22 10:23:36 Info: auth-worker(default): mysql: Connected to /var/run/mysql/mysql.sock (exim)
dovecot: May 22 10:23:36 Info: auth-worker(default): sql(admin,192.168.0.2): query: SELECT password FROM mailbox WHERE name = 'admin' AND active='1'
dovecot: May 22 10:23:36 Info: auth(default): client out: OK 1 user=admin
dovecot: May 22 10:23:36 Info: auth(default): master in: REQUEST 1 24897 1
dovecot: May 22 10:23:36 Info: auth-worker(default): sql(admin,192.168.0.2): SELECT domain AS name , 521 AS 'uid' , 521 AS 'gid' FROM mailbox WHERE name = 'admin'
dovecot: May 22 10:23:36 Info: auth(default): master out: USER 1 admin name=serv.hbd uid=521 gid=521
dovecot: May 22 10:23:36 Info: pop3-login: Login: user=<admin>, method=PLAIN, rip=192.168.0.2, lip=192.168.0.1
dovecot: May 22 10:23:36 Info: POP3(admin): Effective uid=521, gid=521
dovecot: May 22 10:23:36 Info: POP3(admin): maildir: data=/var/mail//admin
dovecot: May 22 10:23:36 Info: POP3(admin): maildir++: root=/var/mail//admin, index=, control=, inbox=/var/mail//admin
dovecot: May 22 10:23:37 Info: POP3(admin): Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0
Все как хотел, но значение %d постоянно пустое, и где его брать? Как Dovecot определяет домен запрашиваемой почты?
Прошу у Вас помощи в понимании данного этапа работы почтовой системы без изучения английского. Кроме того, что систему мне нужно запустить еще вчера (уже горю, надеюсь на помощь) может подскажете, где прочесть курс для МУА.
С уважением и надеждой.
Последний раз редактировалось mastertron 2009-05-22 15:42:12, всего редактировалось 2 раза.
Делай как нибудь, а как надо - само получится!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение skeletor » 2009-05-22 12:34:40

Это переменная должна отвечать за именование домена. Но в конфигах у вас вообще не указан домен. А берёт он его из базы, параметры запроса к которой прописаны в dovecot-sql.conf

Код: Выделить всё

user_query = SELECT domain 

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-22 13:09:25

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

Код: Выделить всё

user_query = SELECT domain , 521 AS 'uid' , 521 AS 'gid' \
    FROM mailbox WHERE name = '%n'
Смысл, чтоб организовать /var/mail/домен/имя пользователя . Я указал "mail_location = maildir:/var/mail/%d/%u" в конфиге, в надежде, что он сам знает, какого домена к нему обратился юзер. Получается, что незнает? Ему нужно это указывать? Тогда как решается вопрос, если в разных доменах одноименные юзеры?
Чтот я зашился. Бывает такое, стало колом :cz2: в голове много спама ....
Делай как нибудь, а как надо - само получится!

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение skeletor » 2009-05-22 13:21:58

Укажите в конфиге так:

Код: Выделить всё

mail_location = maildir:/var/mail/%h
У меня именно так и работает. Правда у меня так /var/mail/домен/имя пользователя@мой_домен

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-22 15:12:55

Если при опросе domain из БД задать AS home или както по другому. Но если тот же логин и пароль, но другого домена, как тогда? Через веб интерфейс - понятно, а при работе клиентом?
А у Вас несколько доменов? Одинаковые юзеры (имена) в доменах есть?
Возможно я не верно сформулировал вопрос ...
На одном хосте в БД два домена, в этих двух доменах есть разные (физически тоже) пользователи с одинаковыми логинами (предположим, что и паролями), возможно ли забирать почту удаленными клиентами с этого хоста каждый со своего ящика? И как это реализуется (работает)? Хоть в двух словах ...
Делай как нибудь, а как надо - само получится!

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение skeletor » 2009-05-22 15:40:41

У меня несколько почтовых доменов, которые обслуживает один сервак. В конфиге dovecot-sql.conf задаю так:

Код: Выделить всё

password_query = SELECT pw_encrypted AS password FROM users WHERE address = '%n@%d' AND ok = 'Y'
user_query = SELECT maildir AS home, uid, gid FROM users WHERE address = '%n@%d'
а home для каждого домена свой.

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-22 16:10:17

Тут что то не так, у Вас значение %d передается в БД, а не из.
Ну если расписать Ваш запрос, то:
Искать пароль в таблице user который соответствует %n@%d
Второй примерно тоже. Я переписал с учетом своих названий в БД, но значение %d при подключении клиентом остается пустым!!! Вот лог:

Код: Выделить всё

dovecot: May 22 15:56:34 Info: auth-worker(default): sql(admin,192.168.0.2): query: SELECT password FROM mailbox WHERE username = 'admin@' AND active = '1'
dovecot: May 22 15:56:34 Info: auth-worker(default): sql(admin,192.168.0.2): unknown user
dovecot: May 22 15:56:36 Info: auth(default): client out: FAIL	5	user=admin
dovecot: May 22 15:56:36 Info: auth(default): client in: AUTH	6	PLAIN	service=pop3	lip=192.168.0.1	rip=192.168.0.2	lport=110	rport=2101	resp=AGFkbWluAGFkbWlu
dovecot: May 22 15:56:36 Info: auth-worker(default): sql(admin,192.168.0.2): query: SELECT password FROM mailbox WHERE username = 'admin@' AND active = '1'
dovecot: May 22 15:56:36 Info: auth-worker(default): sql(admin,192.168.0.2): unknown user
dovecot: May 22 15:56:38 Info: auth(default): client out: FAIL	6	user=admin
dovecot: May 22 15:56:39 Info: pop3-login: Disconnected (auth failed, 6 attempts): user=<admin>, method=PLAIN, rip=192.168.0.2, lip=192.168.0.1
Посылаю от admin@serv.hbd , а значение домена - нету :( Да, еще смущает, что он принимает "@" просто как символ.
Дело видимо не в работе Dovecot и БД, может не выполнил какието более банальные требования?
ДНС поднят, даже клиента в зону пихнул ... ?????? :st:
Последний раз редактировалось mastertron 2009-05-22 17:35:55, всего редактировалось 1 раз.
Делай как нибудь, а как надо - само получится!

Аватара пользователя
skeletor
майор
Сообщения: 2548
Зарегистрирован: 2007-11-16 18:22:04

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение skeletor » 2009-05-22 16:40:26

Что значит в БД, а не из БД?

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-22 17:08:40

password_query = SELECT pw_encrypted AS password FROM users WHERE address = '%n@%d' AND ok = 'Y'
user_query = SELECT maildir AS home, uid, gid FROM users WHERE address = '%n@%d'
SELECT (выбрать/получить данные) pw_encrypted (из колонки) AS (ассоциировать результат/пихнуть результат еще и в ..) password FROM users ( из (запрос для ..) указанной таблицы ) WHERE ( в случае совпадения в той же строке указанного параметра ) address = '%n@%d' ( чтоб столбец address совпал со значением %n@%d) Ну в конце еще условие, "и чтоб мне "OK" был "Y" !"
То есть это значение передается в БД в качестве параметра для поиска.
Ну, я БД плохо знаю, могу ошибаться, если нет - подскажите.
Делай как нибудь, а как надо - само получится!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35426
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение Alex Keda » 2009-05-24 1:54:19

2 тредстартер.
если вы довекоту отправляете тока локалпарт, доменную часть он должен за вас потелепатировать?
как он будет различать vasya@domen1 и vasya@domen2 если вы ему отпарвили просто vasya?
в качестве логина используйте полный адрес. из него домен и выковырнется.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-24 14:34:11

Да, спасибо.
Тяжело искать и разбирать возможности, не зная, есть ли они вообще.
Ответ прост - почтовый пользовательский агент принимает от пользователя только логин и пароль, и данные о домене самостоятельно он вытащить с клиента не может. Ну, в частности - pop3.
Один из вариантов иметь (обслуживать) пользователей нескольких доменов одним хостом - вместо логина вписывать полное название ящика, как это предлагает postfixadmin.
Проблема в том, что это действительно уродливо, особенно со стороны клиентов, поэтому многие столкнувшись с этим и недоумевают, как же НОРМАЛЬНО организован почтовый сервер, обслуживающий несколько доменов в сторону клиента? Или это просто не возможно? Или это реализуется только используя несколько хостов? Можно ли каким либо образом привязать MUA к интерфейсу или IP для анализа и присвоения доменной части?
Так вот, прошу ответа на поставленные вопросы.
( А на счет разных IP - идея неплохая, да? Присвоить интерфейсу альясом еще какой нить IP и пусть пользователи разных доменов конектятся к разным адресам одного хоста, а dovecot анализируя к какому обслуживаемому IP подключение заполняет этот злощастный %d. Только та же ситуация - а это возможно???)
Делай как нибудь, а как надо - само получится!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35426
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение Alex Keda » 2009-05-24 15:24:56

вопросы по одному и в разных темах.
я нифига не понял что вы хотите.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-24 15:59:40

я нифига не понял что вы хотите.
Может ли один хост (почтовый сервер) используя привычный для пользовательей вариант заполнения логина и пароля (без указания вместо логина полного адреса мыла) отвечать клиентам с разных доменов? Интерисует не принцип работы MUA, эт уже понял, а варианты решения поставленной задачи.

Только что спустился с Вашей темы, по поводу запуска двух почтовиков на одном хосте.
Эмоции и надежды ... :Yahoo!: А дальше? (в той теме...)

И допишу - в логах dovecot пишет IP локальный и удаленный, подскажите, где и как можно проанализировать на какой IP приходило подключение, и в зависимости - указать %d ?
Делай как нибудь, а как надо - само получится!

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35426
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение Alex Keda » 2009-05-28 0:20:45

пожалуй, вы слишком много от него хотите =))
на экзиме я бы ещё изгалился прикрутить такое, а вот на довекоте - чё-то даже без идей...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-28 2:21:52

Мда, Вы совершенно правы.
И всем, кто ищет других путей, наподобии меня, советую - делайте как народ рекомендует, а именно:
Ну неоткуда dovecot вытащить домен, как только из логина, а %d - и есть доменная часть логина, если такова присутствует.
Ну и пусть логин будет полным ( логин@домен), и не париться...
Не, извените, не могу успокоиться ....
Вобщем индея следущая - exim кладет почту сам в /var/mail/$domain/$local_part ,
dovecot - ов два, по схеме lissyara (ну, мне нуно на два домена принимать для локалки, на отправку работает отдельный серв.) и работают на разные IP, соответственно в запросах к БД в одном указываю '%n@домен1' , в другом - '%n@домен2' , и все счастливы. Но ... яж не такой крутой, чтоб так - раз, и понял, как указать dovecot где лежит почта.
При этом мне не нужно, чтоб он создавал папки там, работать будет только по pop3 и pop3s.
Подскажите, а? Эксперементы пока результата не дают :( Если не задавать путь maildir и home, то с /var/mail/логин забирает, а свои папки создает в /tmp, а вот чтоб с /var/mail/домен/логин ...
Не нашел описания, что указывают ( какое отличие ) параметров maildir и mbox, что из них замещает home из запроса к БД. Какие еще параметры есть и что конкретно регламентируют?
Ну, народ, на знания не скупись, покупай живоПИСЬ! :smile:
Делай как нибудь, а как надо - само получится!

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

Re: Dovecot для чайника, где берет %d

Непрочитанное сообщение mastertron » 2009-05-30 0:44:30

Разобрался опытным путем, работает - на "УРА".
Один Exim и dovecot - ов по числу доменов (ну ... , два точно работают), и логины у пользователей человеческие.
Хотел разные порты назначить - не получилось.
Вобсчем, здесь больше обсуждать нечего, тема закрыта, всем спасибо.
Делай как нибудь, а как надо - само получится!