Принимает почту из внешнего мира раздает на
внутренние сервера для раскладки их по ящикам. Локальных ящиков не имеет.
создать группу exim и пользователя exim по аналогии с mail
распаковать дистрибутив
exim может использовать различные библиотеки DBM, но лучше если это будет
Berkeley BD 3 без режима эмуляции ndbm (USE_DB в OS/Makefile-Linux) во
избежание путаницы с неверной версией ndbm.h, к тому же она использует
один файл на базу данных
скопировать src/EDITME в Local/Makefile и отредактировать его:
BIN_DIRECTORY=/usr/exim/bin
CONFIGURE_FILE=/usr/exim/configure
EXIM_USER=exim
EXIM_GROUP=exim
SPOOL_DIRECTORY=/var/spool/exim
включить все маршрутизаторы, кроме iplookup
включить все транспорты
нестандартные форматы локальных почтовых ящиков не включать
включить средства просмотра: dbm, lsearch, dsearch, dnsdb,
whoson (требуется whoson.h, которого нет),
mysql (требуется библиотека mysqlclient в /usr/local/mysql)
собирать eximon.bin
включить все механизмы аутентификации (?)
включить поддержку TLS (через OpenSSL), необходима отдельная настройка,
иначе лучше выключить
не надо документации в формате info
LOG_FILE_PATH=syslog:/var/log/exim/%s (директорию надо создать с правами для пользователя exim вручную)
ротация журналов предполагается с помощью внешних средств (logrotate),
но настройки можно оставить
встроенный perl не нужен
PAM не нужен (?)
RADIUS не нужен
tcpwrapper нужен (добавить EXTRALIBS_EXIM=-lwrap)
MAX_NAMED_LIST=16 (достаточно? лучше 32)
MAXINTERFACES=500 (зачем-то собирается информация обо всех интерфейсах
и складывается в таблицу фиксированного размера; такое число не каждому
понадобится ;)
PID_FILE_PATH=/var/run/exim.pid (в RH Linux в /var/lock предназначен для других вещей)
SUPPORT_MOVE_FROZEN_MESSAGES=yes
скопировать exim_monitor/EDITME в Local/eximon.conf и отредактировать его:
пока оставил все по умолчанию
make
make install (если была старая версия, то конфигурация не замещается,
старые версии утилит переименовываются; в общем, лучше посмотреть,
что получилось)
# на эти адреса принимать все
accept local_parts = postmaster : abuse : spam-trap
domains = +local_domains : +relay_to_domains : +our_domain_with_mail : +our_domain_without_mail
# адреса вида no@no.no и otvet@po.telefonu
deny senders = /usr/exim/unwelcome_senders
message = Spam is bad. Dont do it. (uws)
# рассылки, не принимающие отлупов
deny senders = /usr/exim/unaccept_senders
message = Sorry, we dont accept mail from $sender_address, because they dont accept mail from us!
# с некоторых хостов надо принимать почту даже при отсутствии rDNS
# некоторые клиенты хотят получать все письма
deny !hosts = /usr/exim/double_check_exclusion
!recipients = /usr/exim/friendly_to_double_check_error
!verify = reverse_host_lookup
message = Your mail server $sender_fullhost has DNS error.\nPlease consult with Your Internet Service Provider.
# не принимать почту с диалап и приравненных к ним
# некоторые клиенты хотят получать все письма
deny hosts = +dialup_hosts
!recipients = /usr/exim/friendly_to_dialup_hosts
message = Sorry, but we dont accept mail from dialup and so on. Please, use mail server of Your ISP
# не принимать почту с открытых релеев
# некоторые клиенты хотят получать все письма
deny hosts = +open_relay_hosts
!recipients = /usr/exim/friendly_to_open_relay_hosts
message = Sorry, but we dont accept mail from open relay.
# эти мне просто не нравятся (сетки спамеров, разработчиков спам софта и др.)
# некоторые клиенты хотят получать все письма
deny hosts = +unwelcome_hosts
!recipients = /usr/exim/friendly_to_unwelcome_hosts
message = We dont accept mail from this host.
# проверка существования почтового ящика
deny domains = deol.ru : company.ru
!local_parts = +forward_deol : +forward_deol_out : +alias_deol : lsearch;/var/spool/exim/mailboxlist.deol
message = User unknown
deny domains = +our_domain_without_mail
message = User unknown
# прием локальной почты не через SMTP)
accept hosts = :
#deny local_parts = ^.*[/|] # ^.*[@%!/|] кажется слишком суровым:
# сюда попадает X.400 (/), UUCP (!) и всякие почтовые офисы (%)
# проверка валидности адреса отправителя
require verify = sender
# обработка только своей почты
accept domains = +relay_to_domains : +our_domain_with_mail
accept hosts = +relay_from_hosts : +modems_pool : +local_network
deny message = There are no open relay here!
check_data:
accept senders = (список отправителей, почту которых не проверять)
file = /var/spool/mail/$local_part (в Solaris - /var/mail)
delivery_date_add
envelope_to_add
return_path_add
group = mail (иначе при отправке письма по локальному адресу
пытается
создать lock-файл в директории /var/spool/mail сбросив права до
uid/gid, что невозможно)
mode = 0660
секция retry: для каждого внутреннего сервера добавить правило:
имя-хоста refused F,2w,5m
переменные ACL могут иметь произвольные имена, начинающиеся с
"acl_c" (переменные соединения) или "acl_m" (переменные сообщения);
шестой символ должен быть цифра или "_"
модификатор ACL log_reject_target указывает журнал
аутентификатор dovecot
переменная $message_headers_raw
в DNSBL можно указывать 2 имени через запятую: второе используется для фильтрации,
а первое для извлечения текста сообщения из DNS ресурса TXT
опция server_condition у всех аутентификаторов
опции командной строки: -Mset, -bem
опция address_retry_include_sender в транспорте smtp
PCRE 6.7
операторы and, or, xor, not и shift в ${eval
переменная $interface_address переименована в $received_ip_address
переменная $interface_port переименована в $received_port
4.60
селектор отладочной печати acl_warn_skipped
check_rfc2047_length
4.54
изменился алгоритм обработки сочетания helo_try_verify_hosts и "verify = helo"
поддержка Yahoo DomainKeys
изменился формат файла gnutls-param, теперь его можно создавать вручную
утилитой certtool (если exim считает, что в файле лежит мусор, то он
перезаписывает его в новом формате)
вызов внешних функций (EXPAND_DLFUNC=yes при компиляции;
вызов - ${dlfunc; запрет в маршрутизаторе - forbid_filter_dlfunc=true)
переменная $received_time
CRL для SSL
тип ACL acl_not_smtp_mime для сканирования MIME в не-SMTP сообщениях
возможность переопределить макро ("==" вместо "=" )
опции маршрутизатора sieve_useraddress и sieve_subaddress для передачи фильтру
переменная $message_linecount (в заголовке и теле; см. $body_linecount)
поддержка Client SMTP Authorization (verify=csa, $csa_status, dns_csa_use_reverse,
dns_csa_search_limit,)
control = fakedefer
eximstats -xls -show_rt -show_dt
PCRE 6.2
control = submission/name= позволяет подставлять значение в заголовок Sender:
control = fakereject
условие ratelimit (в отличие от smtp_ratelimit_* действует на все соединения
от хоста)
поддержка SPF ($spf_result)
${lookup {john@company.com} spf{192.168.0.1}}
селектор отладочной печати "+all" теперь не включает "+memory"
опция success_on_redirect команды verify
поддержка SQLite (${lookup sqlite; ${quote_sqlite; sqlite_lock_timeout;
LOOKUP_SQLITE=yes при сборке)
переменная $message_id переименована в $message_exim_id
расширение IGNOREQUOTA протокола LMTP: опция ignore_quota транспорта lmtp
и опция lmtp_ignore_quota транспорта smtp
можно задавать номер порта вместе с именем или IP адресом
(host1.tld::1225, dom1.tld/mx::1225) в
списках хостов (маршрутизаторы manualroute, queryprogram;
опции hosts и fallback_hosts транспорта smtp)
оператор "%" в ${eval:}
новое условие verify = not_blind
новое условие control = suppress_local_fixups
селектор отладочной печати unknown_in_list
переменная $smtp_command
модификатор H в секции повторений (аналогично G, но вносит элемент случайности)
4.50
опция сборки - CONFIGURE_GROUP
опция /retain_sender для ACL control=submission
значение address_data после верификации отправителя доступно в
$sender_address_data
/ignore=список-ip для @mx_any, @mx_primary, @mx_secondary
условия подстановки match_domain, match_address, match_local_part
опция smtp_active_hostname
тип поиска iplsearch
селектор журнала ident_timeout, tls_certificate_verified
опция tls_require_ciphers
exinext -C -D
_cache в именованных списках
${time_interval:xxxxx}
селектор журнала queue_time и deliver_time
опция use_sender для callout
PCRE 4.5
утилита exipick
опция tls_crl
${eval10 (рассматривать все числа как десятичные)
опция qualify_domain для маршрутизатора redirect
опция write_rejectlog
селектор журнала +return_path_on_delivery
host_lookup_order (bydns:byaddr)
${quote_local_part
exigrep -t
$received_count
условия timeout_A, timeout_MX, timeout_connect_A,
timeout_connect_MX в правилах повтора
расширена опция port для транспорта smtp
модификатор ACL logwrite
$local_user_uid, $local_user_gid
опция транспортов transport_filter_timeout
From:, Date:, Message-Id: генерируются только для локальных
сообщений
smtp_max_synprot_errors (3)
$mailstore_basename
4.24
PCRE 4.4
опция tcp_nodelay
оператор eqi (сравнение независимо от регистра)
bounce_return_body и bounce_return_size_limit
isip, isip4, isip6 в ${if
$acl_xx передаются из ACL в маршрутизаторы и транспорты
тип поиска nwildlsearch (wildlsearch, но без вычисления
строк для ключей в файле)
селектор журнала smtp_incomplete_transaction
опция tls_remember_esmtp
dnslists = a.b.c!=n.n.n.n
eximstats -nt
headers_charset
RFC 3028
операция & (битовая маска) для dnslists
опция hosts_avoid_esmtp транспорта smtp
ключ /MX в маршрутизаторы manualroute и query program
добавляется заголовок Auto-Submitted: в порождаемые сообщения
опция транспортов rcpt_include_affixes
опция queue_only_override
опция syslog_duplication
аутентификация saslauthd
опция extra_local_interface
опция process_log_path
4.20
переход на PCRE 4.2
при использовании поискового механизма PostgreSQL возможно указывать
команды insert, update и delete - в качестве результата возвращается
число затронутых строк
новый ACL: acl_smtp_helo
опции syslog_facility и syslog_processname
новое действие discard в ACL
4.14
доступ к PostgreSQL с помощью Unix сокетов
smtp_max_unknown_commands позволяет задавать число непонятных
команд, вызывающих разрыв соединения (по умолчанию - 3; раньше было 5)
(чем отличается от smtp_accept_max_nonmail?)
условный пропуск частей конфигурационного файла с помощью
.ifdef, .ifndef, .elifdef, .elifndef, .else и .endif; в качестве
условия используется имя макро (несколько имен макро - OR)
в ACL для MAIL, RCPT и DATA разрешается использоваит проверку
"verify = sender"
при использовании поискового механизма MySQL возможно указывать
команды insert, update и delete - в качестве результата возвращается
число затронутых строк
новое условие маршрутизатора: address_test; устанавливается при
запуске с ключом -bt
новая опция сервера аутентификации: server_advertise_condition;
если установлена в 0 (no, false), то данный механизм аутентификации
не афишируется и не воспринимается
опция authenticated_sender транспорта smtp позволяет использовать его
в режиме LMTP для отравки сообщений в субфолдеры Cyrus IMAP
новая операция вычисления строк: ${rfc2047:строка} - MIME-кодирование
(только ISO-8859-1)
новая операция вычисления строк: ${from_utf8:строка} - преобразование
из UTF8 в ISO-8859-1; непонятные символы преобразуются в подчеркивания
слегка изменился алгоритм образования Message-ID
ключ -bnq подавляет дополнение неполных адресов в локальных сообщениях
селектор отладки +expand позволяет отлаживать вычисление строк
переход на PCRE 4.0
новая операция вычисления строк: ${hex2b64:строка} - преобразует
шестнадцатеричную строку в base64
переменная $tod_zulu содержит время (UTC) в формате ISO 8601:
20030221154023Z
новая операция вычисления строк: ${strlen:строка}
новая операция вычисления строк: ${stat:строка} - выполняет системный
вызов stat() и возвращает результат в виде последовательности
имя=значение (mode, smode, inode, device, links, uid, gid, size,
atime, mtime, ctime)
переменные для передачи информации между этапами обработки ACL
и модификатор ACL set для их установки (при установке символ "$"
опускается)
от $acl_c0 до $acl_c9 существуют на время соединения
от $acl_m0 до $acl_m9 существуют на время обработки сообщения
(сбрасываются по командам MAIL, RSET, EHLO, HELO и при установке
TLS)
опция pipelining_advertise_hosts позволяет задать список хостов,
которым сообщается о возможности PIPELINING (по умолчанию - "*")
опция allow_uit8_domains прозволяет использовать utf8 в именах доменов
(dns_check_names_pattern надо тоже поменять или отменить)
новые команды вычисления строк: $rh_... и $rheader_... аналогичны
$h_... и $header_..., но не удаляет передние и задние пробелы
опция smtp_accept_max_nonmail_hosts позволяет задать список хостов,
для которых действует ограничение smtp_accept_max_nonmail
селектор журнализации host_lookup_failed (по умолчанию включен)
позволяет отменить выдачу в журнал сообщений о невозможности
определить имя хоста по адресу или адрес по имени
опция header_maxsize позволяет задать максимальный размер заголовка
(по умолчанию - HEADER_MAXSIZE, т.е. 1МБ)
опция header_line_maxsize позволяет задать максимальную длину
отдельной строки заголовка (после слияния строк продолжения)
4.11
опция smtp_return_error_details позволяет exim выдавать подробное
сообщение клиенту
квалификатор verify = sender/callout/check_postmaster
позволяет проверить наличие не только адреса отправителя, но и адреса
postmaster в домене отправителя
длинные сообщения (например, от message в ACL) автоматически
режутся на строчки
${quote_ldap: разделился на ${quote_ldap: и ${quote_ldap_dn:
переменная $ldap_dn
изменились правила использования hosts_max_try в smtp-транспорте
опция quota_directory для транспорта appendfile
макрорасширения применяются к физическим, а не логическим строчкам
как ранее, до обработки комментариев и .include; теперь макро
может использоваться внутри вложений
команды AUTH и STARTTLS воспринмаются только, если их возможность
была продекларирована в ответе на EHLO
новые поля отладочной печати: timestamp и pid
новая утилита exiqgrep (exim -bpu | grep)
оператор вычисления контрольной суммы "${sha1:" в дополнение к
"${md5:" (пароль - 40 шестнадцатеричных символов) и ${sha1}
в crypteq
поддержка GnuTLS как альтернативы OpenSSL
транспорт pipe может объявить все ошибки временными ("temp_errors = *")
транспорт lmtp может отправлять сообщения на Unix сокеты
новый тип подстановки: ${readsocket{имя-сокета}{строка-запроса}[{timeout}{\n}{сообщение-об-ошибке}]}; опция forbid_filter_readsocket для маршрутизатора
redirect
можно задавать пустой errors_to в маршрутизаторах (сгенерированное
сообщение об ошибке выбрасывается)
опция disable_logging для маршрутизаторов и транспортов
аутентификация для NTLM (SPA) сервера в дополнение к клиенту
опция smtp_accept_max_nonmail позволяет задавать максимальное число
неправильных команд в сессии (по умолчанию - 10, не учитываются
RSET, HELO/EHLO, STARTTLS)
кеширование проверки методом callout (имя БД - callout);
изменился формат
verify=sender/callout=список-параметров, который поглотил
/callout_defer_ok
(параметр defer_ok) и /check_postmaster (параметр postmaster);
в качестве параметра можно задавать размер timeout и no_cache;
добавлены
опции callout_negative_expire (2h) и callout_positive_expire (24h),
callout_domain_negative_expire (3h) и callout_domain_positive_expire
(7d); параметр random позволяет проверить (и кешировать
результат) не принимает ли удаленный сервер любой адрес;
опция callout_random_local_part позволяет задать формат
"случайного" адреса
log_file_path теперь позволяет задавать метапеременную %D, которая
замещается на текущую дату в формате yyyymmdd (переключение на
новые файлы происходит в полночь; panic не переименовывается);
введена переменная $tod_logfile
добавлена новая форма hash, length, nhash, and substr, которая
позволяет предварительно вычислять параметры (например,
${substr{3}{4}{abcdcdef}} вместо ${substr_3_4:abcdef}
переход на Berkeley DB 4.1
опции randomize и no_randomize для manualroute
операция ${hmac{тип-хеширования}{секрет}{text}}, где тип-хеширования
может быть md5 или sha1, позволяет получить трудноподделываемую
контрольную сумму
опция log_timezone позволяет записывать часовой пояс в журналы;
переменная $tod_zone содержит смещение часового пояса;
exigrep, eximstats, eximon обрабатывают новый формат
переменная $load_average содержит значение средней загрузки,
умноженное на 1000
новая опция router_home_directory
опция message_id_header_domain позволяет задавать доменную часть
Message-Id, если он отсутствует во входном сообщении
(ранее и по умолчанию - имя хоста)
изменился способ определения IP-адреса в manualroute и queryprogram
поправлен достававший меня глюк с $dnslists_text в журнале
селектор rejected_header опции log_selector позволяет отключать
вывод заголовков отвергнутого письма в журнал
опция маршрутизатора cannot_route_message позволяет задать текст
сообщения об ошибке ("Unrouteable address")
новое действие drop в ACL аналогично deny, но закрывает соединение
после сообщения об ошибке
новое действие defer в ACL вызывает выдачу сообщения класса 4xx
модификатор delay в ACL вызывает задержку перед проверкой
модификатор "control = freeze" в ACL вызывает "заморозку" входного
сообщения
модификатор "control = queue_only" в ACL помещает сообщение в очередь
вместо его немедленной обработки
добавлена переменная $host_data
новые опции ACL: acl_smtp_connect, acl_smtp_mail, acl_smtp_starttls,
acl_not_smtp (для сообщений, передаваемых в неинтерактивном
режиме)
добавлена переменная $authentication_failed (в дополнение к
$sender_host_authenticated)
расширен API local_scan()
новый поисковый механизм: wildlsearch - последовательно просматривает
файл как lsearch, но ключ интерпретируется как шаблон (* - подстрока,
^ - регулярное выражение)
ключ в lsearch может содержать маскированнные пробелы и другие
специальные символы
новый поисковый механизм: passwd - возвращает строку из /etc/passwd
новая переменная $tls_certificate_verified
${eval:выражение} позволяет производить простые арифметические
вычисления при вычислении строк: 4 арифметических действия над
целыми числами (десятичные и шестнадцатеричные) и скобки
4.10
добавлена переменная $rcpt_count, которая содержит число полученных
команд RCPT (отличается от $recipients_count!)
добавлена переменная $pid
опция message_logs (по умолчанию - true) позволяет отключить запись
отдельных журналов сообщений в msglog
переменная $acl_verify_message содержит текст, заданный модификатором
message в ACL
4.05
tls_tempfail_tryclear = true
условие condition в ACL не равное 0/1, true/false или yes/no вызывает
теперь временное откладывание сообщения (defer) вместо отбрасывания
4.03
включение в dnslists строк "+include_unknown", "+exclude_unknown" (по
умолчанию), "+defer_unknown" позволяет гибче настраивать поведение
exim в случае ошибок (timeout) DNS BL
опция local_scan_timeout (по умолчанию - 5 минут)
ключ -tls-on-connect позволяет обслуживать устаревших клиентов, не
умеющих выдавать STARTTLS (предполагается использование выделенного
порта вместо SMTP и запуск exim из inetd/xinetd)
поддержка демона pwcheck (библиотека Cyrus SASL),
позволяющего процессам без полномочий root
проверять пароли из /etc/shadow (для команды AUTH)
4.02
helo_allow_chars = "_" (позволяет расширить список разрешенных в HELO/EHLO символов)
4.01
квалификатор verify = sender/no_details в ACL
ключ -oP позволяет явно задать имя файла, в который записывается pid