Sendmail, cyrus и виртуальные домены

Подготовительные этапы

Необходимо установить пакеты (из портов или пакаджей) cyrus-sasl-saslauthd, cyrus-sasl, cyrus-imapd. После этого добавляем в системный /etc/make.conf следующие параметры

SENDMAIL_CFLAGS+=   -I/usr/local/include -DSASL=2 -DSOCKETMAP
SENDMAIL_LDFLAGS+=  -L/usr/local/lib
SENDMAIL_LDADD+=    -lsasl2
и пересобираем системный sendmail:
cd /usr/src/lib/libsm && make clean obj depend all
cd /usr/src/lib/libsmutil && make clean obj depend all
cd /usr/src/usr.sbin/sendmail && make clean obj depend all install

Структура используемых файлов

Для аутентификации и хранения файла алиасов мы будем использовать файл /etc/mail/userdb.db. Для удобства использования его первоначально лучше создавать вручную следующей командой:
cd /etc/mail
makemap -d btree userdb.db <<EOF
EOF

Алиасы в данном файле должны быть в следующем виде:

user@domain.tld:maildrop	alias@some.tld

таких записей для одного e-mail'а можно делать множество, они все будут раскрыты по правилам файла алиасов.

если необходимо что бы почта не только перенаправлялась на какой-либо внешний адрес, но и попадала в cyrus-овский ящик, то нужно сделать две записи такого вида:

user@domain.tld:maildrop	alias@some.tld
user@domain.tld:maildrop	user@domain.tld

Так же в данном файле у нас будет поддерживаться специальная конструкция вида

@domain.tld:maildrop	alias@some.tld
для перенаправления почты для всего домена на один адрес. записи для отдельных e-mail'ов имеют приоритет и отменяют ее действие.

для аутентификации в /etc/mail/userdb.db добавляем специальные записи вида

user@domain.tld:password	passwordhash

проверка осуществляется pam-модулем pam_maildb, для этого в каталог /etc/pam.d добавляем два файла pop и imap одинакового содержания:

auth	required	pam_maildb.so	try_first_pass	sufix=password db=/etc/mail/userdb.db
account	sufficient	pam_permit.so	no_warn
для редактирования /etc/mail/userdb.db можно использовать любые средства, на свой вкус.

Необходимые настройки cyrus

Добавляем строки в /etc/rc.conf.local для запуска saslauthd и cyrus-imapd:

saslauthd_enable="YES"
saslauthd_flags="-r -a pam"
cyrus_imapd_enable="YES"

В /usr/local/etc/cyrus.conf в секцию SERVICES добавляем запуск демона для проверки из sendmail доступности imap-ящиков:

  # Sendmail socket map smmapd(8)
  smmap	cmd="smmapd" listen="/usr/local/cyrus/socket/smmapd" prefork=0

В /usr/local/etc/imapd.conf меняем некоторые умолчания для корректной работы:

unixhierarchysep: yes
servername: imap.host.name
virtdomains: userid
lmtp_downcase_rcpt: yes
username_tolower: yes
sieveusehomedir: false
sievedir: /usr/local/cyrus/sieve
sasl_pwcheck_method: saslauthd
sasl_mech_list: plain
lmtpsocket: /usr/local/cyrus/socket/lmtp
idlesocket: /usr/local/cyrus/socket/idle
notifysocket: /usr/local/cyrus/socket/notify

Остальные настройки исправляем по вкусу

Настройки sendmail

В .mc добавляем следующие настройки:

FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
TRUST_AUTH_MECH(`GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
define(`confAUTH_MECHANISMS',`GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl
define(`confAUTH_OPTIONS', `A')dnl
define(`confUSERDB_SPEC', /etc/mail/userdb.db)dnl
Kvluser btree -m -a<> /etc/mail/userdb

LOCAL_CONFIG
# Cyrus smmapd(8)'s map for verifying mailboxes of local recipients
Kcyrus socket -a<OK> -T<TMPF> /usr/local/cyrus/socket/smmapd

MAILER_DEFINITIONS
Mvirtual,	P=[IPC], F=lsDFMnqXzA@/:|m5,
		S=EnvFromSMTP/HdrFromSMTP, R=VDom/HdrToSMTP, E=\r\n,
		T=DNS/RFC822/SMTP,
		A=FILE /usr/local/cyrus/socket/lmtp

LOCAL_RULESETS
SVDom
R$+			$: $> "EnvToSMTP" $1
R$+ < @ $* .>		$: $1 < @ $2 >
R$+ < @ $* >		$: $1 $(mailertable $2 $)
R$+ virtual : $*	$: $1 @ $2
R$*			$: $(vluser $1:maildrop $)
R$* :maildrop<>		$@ $1
R$* :maildrop		$: <!> $1 $| $(cyrus $1 $: $)
R<!> $* $| $* <OK>	$@ $1
R<!> $* $| $* <TMPF>	$@ $1
R<!> $* $| $*		$: $1
R$+ @ $+		$: $1 $(vluser @$2:maildrop $)
R$+ @ $+ :maildrop<>	$@ @$2
R$* :maildrop		$: $1

SLocal_localaddr
R$+ @ $* 		$: $1 @ $2 <!> $(mailertable $2 $)
R$+ <!> virtual : $*	$@ $> "ckuser_cyrus" $1
R$+ <!> $*		$: $1


Sckuser_cyrus
#Query smmapd(8)
R$+			$: <!> $1 $| $(cyrus $1 $: $)
#Cyrus OK, skip
R<!> $* $| $* <OK>	$@ $1                                   
#Over quota or lookup failure
R<!> $* $| $* <TMPF>	$# error $@ 4.3.0 $: "451 TEMPFAIL."    
#Mailbox doesn't exist or its ACL forbids posting
R<!> $* $| $*		$# error $@ 5.1.1 $: "550 Mailbox is not available."

Остальные настройки, опять же, по вкусу.

Добавление доменов и аккаунтов

Теперь для обработки какого-либо домена в данной конструкции необходимо

Enjoy!

Замечания и предложения отправлять сюда