Записи с меткой ‘smtp’

Почта для кириллических доменов

На текущий момент только один почтовик заявляет и выпускает хоть какие-то релизы с поддержкой SMTPUTF8 или RFC 6531. Это экспериментальные релизы Postfix 2.12.
Но даже при наличии поддержки в нём система доставки кириллической почты просто так не заработает. Поэтому запасаемся напильником.
Настраивать сервер будем под Debian 7. В моём случает он внутри VZ контейнера, а эксперименты проводились внутри LXC контейнера.
После создания контейнера сносим оттуда штатный почтовик, если он есть:

apt-get purge exim* sendmail* и пр.

Качаем последнюю версию Postfix 2.12 experimental release:

wget http://mirrors-ru.go-parts.com/postfix/source/experimental/postfix-2.12-20140905.tar.gz

Заранее создаём юзера и группу:

useradd postfix -s /bin/false
groupadd postdrop

Распаковываем:

tar -zxf postfix-2.12-20140905.tar.gz

Патчим src/smtpd/smtpd.c:

apt-get install patch
patch postfix-2.12-20140905/src/smtpd/smtpd.c smtpd.patch

где smtpd.patch имеет содержимое:

--- smtpd.c	2014-10-06 00:15:18.000000000 +0400
+++ smtpd.c.force.smtputf8	2014-10-07 15:36:21.352884670 +0400
@@ -2317,21 +2317,8 @@
 	return (-1);
     }
 
-    /*
-     * XXX The sender address comes first, but the optional SMTPUTF8
-     * parameter determines what address syntax is permitted. We must process
-     * this parameter early.
-     */
-    if (var_smtputf8_enable
-	&& (state->ehlo_discard_mask & EHLO_MASK_SMTPUTF8) == 0) {
-	for (narg = 3; narg < argc; narg++) {
-	    arg = argv[narg].strval;
-	    if (strcasecmp(arg, "SMTPUTF8") == 0) {	/* RFC 6531 */
-		smtputf8 = 1;
-		break;
-	    }
-	}
-    }
+    smtputf8 = 1;
+
     if (extract_addr(state, argv + 2, PERMIT_EMPTY_ADDR,
 		     var_strict_rfc821_env, smtputf8) != 0) {
 	state->error_mask |= MAIL_ERROR_PROTOCOL;

Нужно это для того, чтобы почтовые клиенты, которые на данный момент не готовы полностью к таким серверам, могли через них всё-таки почту отправлять.
Дело в том, что эта сборка Postfix для активации SMTPUTF8 режима должна на входе получить:

RCPT TO:< юзер@домен.рус> SMTPUTF8

Быстрая проверка показала, что даже почтовые клиенты заявившие о поддержке IDN почты не отправляют SMTPUTF8 в RCPT TO и тем самым создают себе проблемы с отправкой.

Готовимся к сборке:

apt-get install build-essential libdb-dev libicu-dev libssl-dev
apt-get install checkinstall
apt-get install rsyslog telnet

Заодно готовимся к использованию Dovecot в качестве средства авторизации:

apt-get install dovecot-imapd dovecot-pop3d

Собираем с поддержкой SASL и TLS:

cd postfix-2.12-20140905
make makefiles CCARGS='-DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\" -DUSE_TLS' AUXLIBS="-ldb -lnsl -lresolv -lssl"
make
make install

Теперь надо это всё настроить:
В /etc/dovecot/conf.d/10-master.conf правим сокет для авторизации (95 строка примерно):

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

В /etc/dovecot/conf.d/10-auth.conf (99 строка примерно) добавляем любимые способы авторизации, например:

auth_mechanisms = plain login

Перезапускаем:

/etc/init.d/dovecot restart

Должно заработать.

После правки конфиг Postfix /etc/postfix/main.cf получился такой:

queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
myhostname = postfix.regtime.net
mydomain = postfix.regtime.net
inet_interfaces = all
unknown_local_recipient_reject_code = 550
alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases
home_mailbox = Mailbox
 
mail_spool_directory = /var/mail
  
debug_peer_level = 6
debugger_command =
	 PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
	 ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/local/man
sample_directory = /etc/postfix
readme_directory = no
inet_protocols = ipv4
meta_directory = /etc/postfix
shlib_directory = no

smtputf8_autodetect_classes = all
smtputf8_enable = yes

virtual_mailbox_domains = русскийдомен.рф
virtual_mailbox_base = /var/spool/mail
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailbox
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/spool/postfix/private/auth
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination

smtpd_tls_CAfile = /etc/ssl/certs/ca.pem
smtpd_tls_CApath = /etc/ssl/certs
smtpd_tls_cert_file = /etc/dovecot/dovecot.pem
smtpd_tls_key_file = /etc/dovecot/private/dovecot.pem
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_session_cache
smtpd_use_tls = yes

# Enable STARTTLS encryption 
smtp_use_tls = yes
smtp_tls_CAfile = /etc/ssl/certs/ca.pem
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_tls_session_cache
smtpd_tls_security_level = may

smtpd_tls_received_header = yes
smtpd_tls_loglevel = 1
smtpd_tls_auth_only = no
tls_random_source = dev:/dev/urandom

Настройка для довольно простого использования обычных системых mailbox’ов на одном кириллическом домене. Те кто разбирается в Postfix чуть более глубоко — может это легко перенастроить под более привычные ему варианты.

В /etc/postfix/virtual_mailbox пишем:

имя.фамилия@русскийдомен.рф  user1

где user1 — системный юзер, которого нужно добавить штатной командой:

useradd user1 -s /bin/false

А в /etc/postfix/uid_maps:

имя.фамилия@русскийдомен.рф  1000

где 1000 — это uid для user1.

Тут же становится понятно, что для авторизации будет использован классический ASCII логин user1 и пароль к нему. В качестве POP3/IMAP4/SMTP сервера postfix.regtime.net.

Преобразуем это в хэш:

postmap /etc/postfix/aliases
postmap /etc/postfix/virtual_mailbox
postmap /etc/postfix/uid_maps

Перечитываем конфиг или запускаем, перезапускаем Postfix:

postfix reload/stop/start

Проверяем:

# telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 postfix.regtime.net ESMTP Postfix
EHLO localhost
250-postfix.regtime.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250 SMTPUTF8
quit
221 2.0.0 Bye
Connection closed by foreign host.

Теперь когда сервер умеет работать с кириллическими адресами настало время выбрать клиента.
Гарантировано работает Claws Mail начиная с версии 3.9.3.
Evolution 3.10.4 тоже справляется с этой задачей.
Есть специальный клиент — EAI-SMTPUTF8 v.2.0
Гарантированно не работает Mozilla Thunderbird.