Модуль ngx_mail_core_module

Пример конфигурации
Директивы
     listen
     mail
     protocol
     resolver
     resolver_timeout
     server
     server_name
     timeout

По умолчанию этот модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра --with-mail.

Пример конфигурации

worker_processes 1;

error_log /var/log/nginx/error.log info;

events {
    worker_connections  1024;
}

mail {
    server_name       mail.example.com;
    auth_http         localhost:9000/cgi-bin/nginxauth.cgi;

    imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA;

    pop3_auth         plain apop cram-md5;
    pop3_capabilities LAST TOP USER PIPELINING UIDL;

    smtp_auth         login plain cram-md5;
    smtp_capabilities "SIZE 10485760" ENHANCEDSTATUSCODES 8BITMIME DSN;
    xclient           off;

    server {
        listen   25;
        protocol smtp;
    }
    server {
        listen   110;
        protocol pop3;
        proxy_pass_error_message on;
    }
    server {
        listen   143;
        protocol imap;
    }
    server {
        listen   587;
        protocol smtp;
    }
}

Директивы

Синтаксис: listen адрес:порт [ssl] [backlog=число] [bind] [ipv6only=on|off] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Умолчание:
Контекст: server

Задаёт адрес и порт сокета, на котором сервер будет принимать запросы. Можно указать только порт. Кроме того, адрес может быть именем сервера, например:

listen 127.0.0.1:110;
listen *:110;
listen 110;     # то же, что и *:110
listen localhost:110;

IPv6-адреса (0.7.58) задаются в квадратных скобках:

listen [::1]:110;
listen [::]:110;

UNIX-сокеты (1.3.5) задаются при помощи префикса “unix:”:

listen unix:/var/run/nginx.sock;

Разные серверы должны слушать на разных парах адрес:порт.

Параметр ssl указывает на то, что все соединения, принимаемые на данном порту, должны работать в режиме SSL.

В директиве listen можно также указать несколько дополнительных параметров, специфичных для связанных с сокетами системных вызовов.

backlog=число
задаёт параметр backlog в вызове listen(), который ограничивает максимальный размер очереди ожидающих приёма соединений (1.9.2). По умолчанию backlog устанавливается равным -1 для FreeBSD, DragonFly BSD и macOS, и 511 для других платформ.
bind
указывает, что для данной пары адрес:порт нужно делать bind() отдельно. Это нужно потому, что если описаны несколько директив listen с одинаковым портом, но разными адресами, и одна из директив listen слушает на всех адресах для данного порта (*:порт), то nginx сделает bind() только на *:порт. Необходимо заметить, что в этом случае для определения адреса, на который пришло соединение, делается системный вызов getsockname(). Если же используются параметры ipv6only или so_keepalive, то для данной пары адрес:порт всегда делается отдельный вызов bind().
ipv6only=on|off
этот параметр определяет (через параметр сокета IPV6_V6ONLY), будет ли слушающий на wildcard-адресе [::] IPv6-сокет принимать только IPv6-соединения, или же одновременно IPv6- и IPv4-соединения. По умолчанию параметр включён. Установить его можно только один раз на старте.
so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]
этот параметр конфигурирует для слушающего сокета поведение “TCP keepalive”. Если этот параметр опущен, то для сокета будут действовать настройки операционной системы. Если он установлен в значение “on”, то для сокета включается параметр SO_KEEPALIVE. Если он установлен в значение “off”, то для сокета параметр SO_KEEPALIVE выключается. Некоторые операционные системы поддерживают настройку параметров “TCP keepalive” на уровне сокета посредством параметров TCP_KEEPIDLE, TCP_KEEPINTVL и TCP_KEEPCNT. На таких системах (в настоящий момент это Linux 2.4+, NetBSD 5+ и FreeBSD 9.0-STABLE) их можно сконфигурировать с помощью параметров keepidle, keepintvl и keepcnt. Один или два параметра могут быть опущены, в таком случае для соответствующего параметра сокета будут действовать стандартные системные настройки. Например,
so_keepalive=30m::10
установит таймаут бездействия (TCP_KEEPIDLE) в 30 минут, для интервала проб (TCP_KEEPINTVL) будет действовать стандартная системная настройка, а счётчик проб (TCP_KEEPCNT) будет равен 10.

Синтаксис: mail { ... }
Умолчание:
Контекст: main

Предоставляет контекст конфигурационного файла, в котором указываются директивы почтового сервера.

Синтаксис: protocol imap | pop3 | smtp;
Умолчание:
Контекст: server

Задаёт протокол проксируемого сервера. Поддерживаются протоколы IMAP, POP3 и SMTP.

Если директива не указана, то протокол может быть определён автоматически по общеизвестному порту, указанному в директиве listen:

Поддержку ненужных протоколов можно отключить с помощью конфигурационных параметров --without-mail_imap_module, --without-mail_pop3_module и --without-mail_smtp_module.

Синтаксис: resolver адрес ... [valid=время];
resolver off;
Умолчание:
resolver off;
Контекст: mail, server

Задаёт серверы DNS, используемые для определения имени хоста клиента для передачи его на сервер аутентификации и в команде XCLIENT при проксировании SMTP. Например:

resolver 127.0.0.1 [::1]:5353;

Адрес может быть указан в виде доменного имени или IP-адреса, и необязательного порта (1.3.1, 1.2.2). Если порт не указан, используется порт 53. Серверы DNS опрашиваются циклически.

До версии 1.1.7 можно было задать лишь один DNS-сервер. Задание DNS-серверов с помощью IPv6-адресов поддерживается начиная с версий 1.3.1 и 1.2.2.

По умолчанию nginx кэширует ответы, используя значение TTL из ответа. Необязательный параметр valid позволяет это переопределить:

resolver 127.0.0.1 [::1]:5353 valid=30s;

До версии 1.1.9 настройка времени кэширования была невозможна и nginx всегда кэшировал ответы на срок в 5 минут.

Специальное значение off запрещает использование DNS.

Синтаксис: resolver_timeout время;
Умолчание:
resolver_timeout 30s;
Контекст: mail, server

Задаёт таймаут для операций DNS, например:

resolver_timeout 5s;

Синтаксис: server { ... }
Умолчание:
Контекст: mail

Задаёт конфигурацию для сервера.

Синтаксис: server_name имя;
Умолчание:
server_name hostname;
Контекст: mail, server

Задаёт имя сервера, используемое:

Если директива не указана, используется имя хоста (hostname) машины.

Синтаксис: timeout время;
Умолчание:
timeout 60s;
Контекст: mail, server

Задаёт таймаут, который используется до начала проксирования на бэкенд.