sendmail 8.15.2
Восемь месяцев назад во всех поддерживаемых ветках FreeBSD произошло обновление sendmail с версии 8.14.9 до 8.15.2.
В sendmail-8.15.1 произошло несколько несоместимых со старыми конфигурациями изменений в поведении, с одним и очень неприятым из них столкнулся сразу после обновления одной системы FreeBSD-9.3, использующей связку sendmail+Cyrus IMAPd, когда sendmail доставляет почту в локальное хранилище IMAP использованием протокола LMTP и локального unix-сокета вида /var/imap/socket/lmtp
.
В RELEASE_NOTES сказано, что при возникновении проблем (например, таймауты) с DNS-ресолвингом во время обработки заголовков писем в процессе доставки по протоколам SMTP или LMTP, транзакция обрывается, а это значит, что письмо не доставляется и остаётся в очереди:
If header rewriting fails due to a temporary map lookup failure,
queue the mail for later retry instead of sending it
without rewriting the header. Note: this is done
while the mail is being sent and hence the transaction
is aborted, which only works for SMTP/LMTP mailers
hence the handling of temporary map failures is
suppressed for other mailers. SMTP/LMTP servers may
complain about aborted transactions when this problem
occurs.
See also "DNS Lookups" in sendmail/TUNING.
В версии 8.15.2 это ведет к очень плохим последствиям: уже принятые от внешних почтовых серверов письма вместо мгновенной доставки IMAP-серверу по LMTP могут неопределенно долго (часами) залеживаться в очереди, потенциально вечно. Бывает, что письмо приходит с envelope-to существующего ящика в локальном IMAP-хранилище, но при этом в заголовке To в самом письме кроме адреса нашего пользователя указаны адреса чужих доменов, DNS-сервера которых не отвечают. Вместо того, чтобы просто отдать письмо по LMTP, sendmail в момент доставки начинает обращаться к DNS и обрывает транзакцию по таймауту с невнятной диагностикой:
SYSERR(root): timeout writing message to localhost
При этом письмо остается лежать в очереди с состоянием
stat=Deferred: Name server: localhost: host name lookup failure
.RELEASE_NOTES ссылаются на документ TUNING, где упомянута
FEATURE(`nocanonify', `canonify_hosts')
и сказано:Note: starting with 8.15, sendmail will not ignore temporary map
lookup failures during header rewriting, which means that DNS lookup
problems even for headers will cause messages to stay in the queue.
Hence it is strongly suggested to use the nocanonify feature;
at least turning it on for the MTA, but maybe disabling it for the
MSA, i.e., use Modifiers for DaemonPortOptions accordingly.
As a last resort, it is possible to override the host map to ignore
temporary failures, e.g.,
Khost host -t
However, this can cause inconsistent header rewriting.
Получается, что теперь необходимо всегда добавлять эту FEATURE в конфигурацию .mc во избежание недоставки почты.