Exim - настройка почтового сервера на базе Exim с хранением списка пользователей в БД MySQL и поддержкой квотирования

  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:000347a375eca83aff79287b2b263f82' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><img alt=\"MTA Exim\" width=\"140\" height=\"105\" src=\"http://muff.kiev.ua/files/exim.png\" /></p>\n<p class=\"rtejustify\">Давно уже собирался написать статью о настройке почтового сервера, но все никак не находилось свободного времени, во время настройки очередного &quot;почтовика&quot;. Сейчас же вроде не очень &quot;подгоняют&quot;,&nbsp;соответственно попытаемся все подробно задокументировать.</p>\n<p class=\"rtejustify\">Итак, исходные данные:</p>\n<ul>\n<li>домен: <strong>ispalternativa.net.ua</strong></li>\n<li>IP-адрес сервера: <strong>91.221.84.10</strong></li>\n<li>имя сервера: <strong>mail.ispalternativa.net.ua</strong></li>\n</ul>\n<p class=\"rtejustify\"><span style=\"color: #ff0000\"><strong>Важно!</strong></span> Согласно RFC, необходимо, чтобы &quot;прямая&quot; и &quot;обратная&quot; запись в ДНС совпадали. Тоесть в нашем случае,&nbsp;необходимо чтобы запись <strong>mail.ispalternativa.net.ua</strong> &quot;резолвилась&quot; в IP-адрес <strong>91.221.84.10</strong>, а PTR-запись <strong>91.221.84.10</strong> была установлена в <strong>mail.ispalternativa.net.ua</strong>.</p>\n<p>Проверяем эти условия:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>host mail.ispalternativa.net.ua</strong><br />\n mail.ispalternativa.net.ua has address <span style=\"color: #ff0000\">91.221.84.10</span></p>\n<p><span style=\"color: #000000\"># <strong>host 91.221.84.10<br />\n </strong>10.84.221.91.in-addr.arpa domain name pointer </span><span style=\"color: #ff0000\">mail.ispalternativa.net.ua.</span></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">С ДНС-записями почти разобрались... Проверим еще,&nbsp;чтобы МХ-запись домена указывала на наш почтовый сервер:</p>\n<p><table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>dig MX ispalternativa.net.ua</strong></p>\n<p>; &lt;&lt;&gt;&gt; DiG 9.6.2-P2 &lt;&lt;&gt;&gt; MX ispalternativa.net.ua<br />\n ;; global options: +cmd<br />\n ;; Got answer:<br />\n ;; -&gt;&gt;HEADER&lt;&lt;- opcode: QUERY, status: NOERROR, id: 57347<br />\n ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3</p>\n<p>;; QUESTION SECTION:<br />\n ;ispalternativa.net.ua.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MX</p>\n<p>;; ANSWER SECTION:<br />\n ispalternativa.net.ua.&nbsp; 2756&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10 <span style=\"color: #ff0000\">mail.ispalternativa.net.ua.<br />\n </span>ispalternativa.net.ua.&nbsp; 2756&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20 smtp.ispalternativa.net.ua.</p>\n<p>;; AUTHORITY SECTION:<br />\n ispalternativa.net.ua.&nbsp; 2756&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ns2.h26.hvosting.ua.<br />\n ispalternativa.net.ua.&nbsp; 2756&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ns1.h26.hvosting.ua.</p>\n<p>;; ADDITIONAL SECTION:<br />\n mail.ispalternativa.net.ua. 3600 IN&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style=\"color: #ff0000\">91.221.84.10<br />\n </span>smtp.ispalternativa.net.ua. 2756 IN&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 91.200.40.26<br />\n ns1.h26.hvosting.ua.&nbsp;&nbsp;&nbsp; 344&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 91.200.40.26<br />\n ns2.h26.hvosting.ua.&nbsp;&nbsp;&nbsp; 344&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 62.149.29.26</p>\n<p>;; Query time: 2 msec<br />\n ;; SERVER: 127.0.0.1#53(127.0.0.1)<br />\n ;; WHEN: Sun Aug&nbsp; 7 00:15:03 2011<br />\n ;; MSG SIZE&nbsp; rcvd: 173</p>\n</td>\n</tr>\n</tbody>\n</table>\n</p>\n<p class=\"rtejustify\">MX-запись&nbsp;указывает на наш сервер, здесь все в порядке. Пора приступать&nbsp;непосредственно к установке Exim.</p>\n<p class=\"rtejustify\">Первым делом внесем некоторые изменения в <strong>/etc/make.conf</strong>. Добавим такую секцию:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># Задаем переменную - путь к каталогу портов<br />\n PORTSDIR?= /usr/ports<br />\n # EXIM<br />\n .if ${.CURDIR} == ${PORTSDIR}/mail/exim<br />\n LOG_FILE_PATH?= syslog<br />\n WITH_DEFAULT_CHARSET?= koi8-r<br />\n .endif</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Дело в том, что по умолчанию <strong>Exim</strong> пишет логи в свой каталог,&nbsp;что не очень удобно. Указав же,&nbsp;что необходимо использовать <strong>syslog</strong>, логи будут писаться в <strong>/var/log/maillog</strong>. Добавляем именно в <strong>make.conf</strong> по той причине,&nbsp;что все опции, кроме логгирования,&nbsp;можно будет задать при запуске <strong>make config</strong>. Редактировать <strong>Makefile</strong> тоже не советую,&nbsp;поскольку при обновлении портов он просто будет перезаписан.</p>\n<p class=\"rtejustify\">Подготовка&nbsp;к инсталляции окончена. Даем команду на установку.</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>cd /usr/ports/mail/exim &amp;&amp; make install clean &amp;&amp; rehash</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Выставляем необходимые опции сборки. Главное - не забыть включить поддержку <strong>MySQL</strong>...</p>\n<p class=\"rtejustify\">\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p class=\"rtecenter\"><strong>Options for exim 4.76</strong></p>\n<pre>\n[ ] ALT_CONFIG_PREFIX Restrict the set of configuration files\n[X] AUTH_CRAM_MD5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable CRAM-MD5 authentication mechanisms\n[X] AUTH_DOVECOT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable Dovecot authentication mechanisms\n[X] AUTH_PLAINTEXT&nbsp;&nbsp;&nbsp;&nbsp; Enable plaintext authentication\n[ ] AUTH_RADIUS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable radius (RFC 2865) authentication\n[ ] AUTH_SASL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable use of Cyrus SASL auth library\n[X] AUTH_SPA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable Secure Password Authentication\n[X] CDB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable CDB-style lookups\n[Х] CONTENT_SCAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable exiscan email content scanner\n[X] DAEMON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Install scripts to run as a daemon\n[ ] DCC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable DCC at ACL support via dccifd\n[ ] DEBUG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Build with debugging symbols\n[X] DISABLE_D_OPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Disable macros overrides using option -D\n[X] DNSDB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable DNS-style lookups\n[X] DSEARCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable directory-list lookups\n[X] EMBEDDED_PERL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable embedded Perl interpreter\n[ ] EXIMON&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Build eximon monitor (require XFree86!)\n[X] ICONV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable header charset conversion\n[ ] IPV6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable IPv6 support\n[ ] KAS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Build with Kaspersky AntiSpam local scan \n[X] LMTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RFC2033 SMTP over command pipe transport\n[X] LSEARCH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable wildcarded-file lookups\n[X] MAILDIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable Maildir mailbox format\n[X] MAILSTORE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable Mailstore mailbox format\n[X] MBX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable MBX mailbox format\n[X] MYSQL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Link against libmysqlclient library\n[X] NIS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable NIS-style lookups\n[X] OLD_DEMIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable old, deprecated demime ACL\n[ ] OPENLDAP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Link against libldap\n[X] PAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable PAM authentication mechanisms\n[ ] PASSWD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable /etc/passwd lookups\n[ ] PGSQL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Link against libpq\n[X] READLINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable readline(3) library\n[ ] SASLAUTHD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable use of Cyrus SASL auth daemon\n[ ] SA_EXIM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SA-Exim support\n[ ] SO_1024&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Build with Spamooborona-1024 local scan\n[X] SPF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable Sender Policy Framework checking\n[ ] SQLITE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable SQLite lookups\n[X] SRS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable Sender Rewriting Scheme\n[ ] SRS_ALT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable alternative SRS library\n[X] SUID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Install the exim binary suid root\n[ ] TCP_WRAPPERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable /etc/hosts.allow access control\n[X] TLS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Link against OpenSSL\n[ ] WISHLIST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Include the unsupported patches\n[ ] XCLIENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable XCLIENT command in exim</pre></td>\n</tr>\n</tbody>\n</table>\n</p>\n<p class=\"rtejustify\">Также не стоит забывать об антивирусной поддержке в <strong>Exim</strong>. Поэтому устанавливаем <strong>Clamav</strong> согласно <a href=\"http://muff.kiev.ua/content/clamav-antivirusnaya-zashchita-servera\">этой статьи</a>.</p>\n<p class=\"rtejustify\">После установки и запуска <strong>Clamav</strong> приступаем к редактированию конфигурационного файла <strong>Exim</strong>. Постараюсь максимально комментировать строки,&nbsp;но не обещаю детальное описание. Скачать конфигурационный файл можно по <a href=\"http://muff.kiev.ua/files/configure\">этой ссылке</a>.</p>\n<p class=\"rtejustify\">А здесь вывод файла <strong>/usr/local/etc/exim/configure</strong> с комментариями.</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td bgcolor=\"#cccccc\">\n<pre><strong><span style=\"color: #0000ff\">############################################################################\n# Runtime configuration file for Exim #\n# MAIN CONFIGURATION SETTINGS #\n############################################################################</span>\n\n\n\n<span style=\"color: #0000ff\"># Имя хоста. Используется в HELO/EHLO. Необходимо, чтобы содержалось имя\n# домена, для которого принимаем почту. Правильный вариант - чтобы этот\n# параметр совпадал с именем MX-записи.\n</span><span style=\"color: #000000\">primary_hostname = </span><span style=\"color: #ff0000\">mail.ispalternativa.net.ua\n\n</span></strong></pre><pre><strong><span style=\"color: #0000ff\"># Список доменов, для которых будем принимать почту. В нашем случае\n# выборка делается из БД MySQL.\n</span><span style=\"color: #000000\">domainlist local_domains = ${lookup mysql{SELECT domain FROM domains \\\n WHERE domain=\'${domain}\' AND \\\n (type=\'LOCAL\' OR type=\'VIRTUAL\')}}\n\n</span>\n\n<span style=\"color: #0000ff\"># Список доменов, для которых разрешен релей через данный сервер. Выборка\n# делается из БД MySQL.\n</span><span style=\"color: #000000\">domainlist relay_to_domains = ${lookup mysql{SELECT domain FROM domains \\\n WHERE domain=\'${domain}\' AND type=\'RELAY\'}}\n\n</span></strong></pre><pre><strong><span style=\"color: #0000ff\"># Список отправителей, которых считать &quot;спамерами&quot;. Выборка делается из БД\n# MySQL. </span><span style=\"color: #000000\">hostlist spamers = ${lookup mysql{SELECT senders FROM blacklist_host WHERE \\\n senders=\'${sender_host_address}\'}}\n\n</span>\n\n<span style=\"color: #0000ff\"># Список сетей, которым будет разрешена отправка без авторизации.\n# Перечисляем сети, которые будут пользоваться даным сервером для\n# отправки почты.\n</span><span style=\"color: #000000\">hostlist relay_from_hosts = localhost : 127.0.0.1 : <span style=\"color: #ff0000\">91.221.84.0/23\n</span>\n</span></strong></pre><pre><strong><span style=\"color: #0000ff\"># Выбираем данные из БД MySQL для поддержки квотирования.\n</span><span style=\"color: #000000\">GET_QUOTA=${lookup mysql{SELECT quota FROM users \\\n WHERE login=\'${local_part}\' AND domain=\'${domain}\'}{${value}M}}\n\n</span>\n\n<span style=\"color: #0000ff\"># Задаем квотирование.</span>\n<span style=\"color: #000000\"><font face=\"Courier New\">MAILDIR_SIZE=${eval:${sg{${sg{${readfile{/var/exim/$domain/$local_part/maildirsize}\\\n {\\n}}}{\\N^.+?\\n\\N}{}}}{\\N(?s)\\s+-?\\d+\\n\\N}{+}}0+500K}</font></span></strong></pre><pre><strong><span style=\"color: #0000ff\"># На каких портах будет &quot;работать&quot; Exim.<br /></span><span style=\"color: #000000\">daemon_smtp_ports = 25 : 465</span>\n\n<span style=\"color: #0000ff\"># Указываем, что на порту 465 будет TLS-шифрование.\n</span><span style=\"color: #000000\">tls_on_connect_ports = 465</span></strong></pre><pre><strong><span style=\"color: #0000ff\"># Перечисляем, для каких хостов будет доступно TLS-шифрование.\n</span><span style=\"color: #000000\">tls_advertise_hosts = *</span>\n\n<span style=\"color: #0000ff\"># Указываем путь к сертификату и ключу шифрования.\n</span><span style=\"color: #000000\">tls_certificate = /etc/ssl/certs/mail.pem\ntls_privatekey = /etc/ssl/certs/mail.pem</span></strong></pre><pre><strong><span style=\"color: #0000ff\"># Выбираем, что будем логировать\n# + - писать в логи,\n# - - Не писать в логи.\n# +all_parents - все входящие соединения\n# +lost_incoming_connections - потеряные входящие соединения\n# +received_sender - отправитель\n# +received_recipients - получатель\n# +smtp_confirmation - подтверждения SMTP\n# +smtp_syntax_error - ошибки синтаксиса SMTP\n# +smtp_connection - соединение SMTP\n# +smtp_protocol_error - ошибки протокола SMTP\n# -queue_run - работа очереди (замороженные мессаги)\n</span><span style=\"color: #000000\">log_selector = \\\n +all_parents \\\n +lost_incoming_connection \\\n +received_sender \\\n +received_recipients \\\n +smtp_confirmation \\\n +smtp_syntax_error \\\n +smtp_connection \\\n +smtp_protocol_error \\\n -queue_run</span>\n\n<span style=\"color: #0000ff\"># Убираем из логов временную метку Exim`a - её ставит syslogd\n<span style=\"color: #0000ff\"># </span><span style=\"color: #000000\"><span style=\"color: #ff0000\">Внимание!</span> <span style=\"color: #0000ff\">Если планируете использовать утилиту </span></span></span></strong><strong><span style=\"color: #0000ff\"><span style=\"color: #000000\"><a href=\"http://muff.kiev.ua/content/eximstats-sledim-za-rabotoi-pochtovogo-servera\"><em><span style=\"color: #0000ff\">eximstats</span></em></a><span style=\"color: #0000ff\">,\n# необходимо установить в значение yes\n</span>syslog_timestamp = no\n</span>\n# Задаем acl для проверки почты.\n</span>acl_smtp_rcpt = acl_check_rcpt\nacl_smtp_mime = acl_check_mime\nacl_smtp_data = acl_check_data\n\n<span style=\"color: #0000ff\"># &quot;Цепляем&quot; антивирус. Указываем путь к сокету Clamav.\n</span>av_scanner = clamd:/var/run/clamav/clamd.sock\n\n<span style=\"color: #0000ff\"># Доверенные пользователи.\n</span>trusted_users = www\n\n<span style=\"color: #0000ff\"># Имя домена добавляемое для локальных отправителей (пользователей системы). \n# Тоесть почта отправляемая от root, будет root@$qualify_domain.\n</span>qualify_domain = <span style=\"color: #ff0000\">ispalternativa.net.ua\n\n</span><span style=\"color: #0000ff\"># Cписок IP-адресов интерфейсов, на которых ожидаются запросы.\n\n</span>local_interfaces = 127.0.0.1 : <span style=\"color: #ff0000\">91.221.84.10\n\n</span><span style=\"color: #0000ff\"># Принимать ли почту вида имя_пользователя@IP-адрес.\n</span>allow_domain_literals = false\n\n<span style=\"color: #0000ff\"># Имя пользователя и групы, от имени которых будет работать Exim.\n</span>exim_user = mailnull exim_group = mail\n\n<span style=\"color: #0000ff\"># В целях безопасности запрещаем работу от root-а.\n</span>never_users = root\n\n<span style=\"color: #0000ff\"># Когда доставка сообщения откладывается, Exim посылает предупреждающее\n# письмо отправителю, с указанными интервалами.\n</span>delay_warning = 4h:8h:24h:48h\n\n<span style=\"color: #0000ff\"># При генерации сообщения об ошибка &quot;вкладывать&quot; не все сообщение, а \n# &quot;кусок&quot;, указанного размера.\n</span>return_size_limit = 50k\n\n<span style=\"color: #0000ff\"># Резолвить DNS-имена перечисленных хостов.\n</span>host_lookup = *\n\n<span style=\"color: #0000ff\"># Таймаут для резолвинга идентификатора пользователя на удаленной машине.\n</span>rfc1413_hosts = * rfc1413_query_timeout = 0s\n\n<span style=\"color: #0000ff\"># Принудительна синхронизация команд. Не принимать команды от удаленного\n# сервера &quot;потоком&quot;.\n</span>smtp_enforce_sync = true</strong></pre><pre><strong><span style=\"color: #0000ff\"># Контроль повторяющихся строк логов.\n</span>syslog_duplication = false\n\n<span style=\"color: #0000ff\"># Разрешить, чтобы МХ указывал на IP-адрес.\n</span>allow_mx_to_ip</strong></pre><pre><strong><span style=\"color: #0000ff\"># Уничтожать недоставленные рикошеты, если они &quot;старше&quot; указанного времени.</span>\nignore_bounce_errors_after = 2d\n\n<span style=\"color: #0000ff\"># Какой промежуток времени хранить &quot;замороженные&quot; сообщения.\n</span>timeout_frozen_after = 2d</strong></pre><pre><strong><span style=\"color: #0000ff\"># Максимальный размер письма.\n</span>message_size_limit = 20M\n\n<span style=\"color: #0000ff\"># Ограничение на максимальной количество одновременных входящих сообщений.\n</span>smtp_accept_max = 100</strong></pre><pre><strong><span style=\"color: #0000ff\"># Ограничение на максимальное количество сообщений в одной сесию.\n</span>smtp_accept_max_per_connection = 50\n\n<span style=\"color: #0000ff\"># Ограничение на максимальное количество сообщений с одного хоста.\n</span>smtp_accept_max_per_host = 20</strong></pre><pre><strong><span style=\"color: #0000ff\"># Количество соединений по стеку TCP/IP.\n</span>smtp_connect_backlog = 50\n\n<span style=\"color: #0000ff\"># Класть в очередь, при большем числе сообщений за одну сесию.</span>\nsmtp_accept_queue_per_connection = 30</strong></pre><pre><strong><span style=\"color: #0000ff\"># Максимальное количество СМТП-доставок на одно сообщение.</span>\nremote_max_parallel = 15\n\n<span style=\"color: #0000ff\"># Разбиение каталога спула. Увеличивает производительность.</span>\nsplit_spool_directory = true</strong></pre><pre><strong><span style=\"color: #0000ff\"># &quot;Приветствие&quot; сервера.<br /></span>smtp_banner = &quot;$primary_hostname ESMTP Exim&quot;<br /><span style=\"color: #0000ff\"># Параметры соединения с БД MySQL: server/database/username/password.<br /></span>hide mysql_servers = localhost/exim/exim/<span style=\"color: #ff0000\">MySQL-pass-here</span>\n\n<span style=\"color: #0000ff\">############################################################################\n# ACL CONFIGURATION #\n# Specifies access control lists for incoming SMTP mail #\n############################################################################</span></strong></pre><pre><strong>begin acl\n\nacl_check_rcpt:\n\n<span style=\"color: #0000ff\"># Запрещаем письма содержащие в локальной части символы @; %; !; /; |.\n</span>deny message = &quot;Illegal characters are in an address.&quot;\n domains = +local_domains\n local_parts = ^[.] : ^.*[@%!/|]</strong></pre><pre><strong><span style=\"color: #0000ff\"># Запрещаем недопустимые символы для нелокальных получателей.\n</span>deny message = &quot;Illegal characters are in an address.&quot;\n domains = !+local_domains\n local_parts = ^[./|] : ^.*[@%!] : ^.*/\\\\.\\\\./\n\n<span style=\"color: #0000ff\"># Запрещаем прием почты с определенных доменов. С них жестко СПАМ идет.\n# orange.fr\n</span>deny message&nbsp;&nbsp; = &quot;All email from *.orange.fr - discarded!&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp; condition = ${if match{$sender_helo_name}{.orange.fr}{yes}{no}}<br /><span style=\"color: #0000ff\"># mdp2.net<br /></span>deny message&nbsp;&nbsp; = &quot;All email from *.mdp2.net - discarded!&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp; condition = ${if match{$sender_helo_name}{.mdp2.net}{yes}{no}}<br /><span style=\"color: #0000ff\"># mail.comcast.net<br /></span>deny message&nbsp;&nbsp; = &quot;All email from *.mail.comcast.net - discarded!&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp; condition = ${if match{$sender_helo_name}{.mail.comcast.net}{yes}{no}}<br /><span style=\"color: #0000ff\"># libero.it<br /></span>deny message&nbsp;&nbsp; = &quot;All email from *.libero.it - discarded!&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp; condition = ${if match{$sender_helo_name}{.libero.it}{yes}{no}}<br /><span style=\"color: #0000ff\"># ono.com<br /></span>deny message&nbsp;&nbsp; = &quot;All email from *.ono.com - discarded!&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp; condition = ${if match{$sender_helo_name}{.ono.com}{yes}{no}}<br /><span style=\"color: #0000ff\"># wanadoo.fr<br /></span>deny message&nbsp;&nbsp; = &quot;All email from *.wanadoo.fr - discarded!&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp; condition = ${if match{$sender_helo_name}{.wanadoo.fr}{yes}{no}}<br /><span style=\"color: #0000ff\"># Разрешаем отправку, если отправитель находится в &quot;белом списке&quot;. Выборка\n# делается из БД MySQL.\n</span>accept senders=${lookup mysql{SELECT senders FROM whitelist \\\n WHERE senders=\'${quote_mysql:$sender_address}\' \\\n OR senders=\'*@${quote_mysql:$sender_address_domain}\' LIMIT 1}}</strong></pre><pre><strong><span style=\"color: #0000ff\"># Запрещаем отправку тем, кто внесен в &quot;черный список&quot;. Выборка делается из\n# БД MySQL.\n</span>deny message = &quot;Your address in banlist!&quot;\n senders=${lookup mysql{SELECT senders FROM blacklist \\\n WHERE senders=\'${quote_mysql:$sender_address}\' \\\n OR senders=\'*@${quote_mysql:$sender_address_domain}\' LIMIT 1}}\n\n<span style=\"color: #0000ff\"># Запрещаем отправку тем, кто &quot;достал&quot; и приравнивается к спамеру. Выборка\n# делается из БД MySQL.\n</span>deny hosts = +spamers<br />&nbsp;&nbsp;&nbsp;&nbsp; message = &quot;Host rejected by spamers list on <span style=\"color: #ff0000\">rbl.ispalternativa.net.ua</span>!&quot;</strong></pre><pre><strong><span style=\"color: #0000ff\"># Разрешаем отправку авторизованным пользователям.\n</span>accept authenticated = *\n\n<span style=\"color: #0000ff\"># Запрещаем тех, кто не обменивается приветственными сообщениями (HELO/EHLO)\n</span>deny message = &quot;HELO/EHLO required by SMTP RFC&quot;\n condition = ${if eq{$sender_helo_name}{}{yes}{no}}</strong></pre><pre><strong><span style=\"color: #0000ff\"># Запрещаем тех, кто в HELO &quot;отдает&quot; только цифры.\n</span>deny condition = ${if match{$sender_helo_name}{\\N^\\d+$\\N}{yes}{no}}\n hosts = !127.0.0.1:!localhost:*\n message = &quot;There can not be only numbers in HELO!&quot;\n\n<span style=\"color: #0000ff\"># Запрещаем тех, кто не пишет отправителя.\n</span>deny condition = ${if eq{$sender_address}{}{yes}{no}}\n hosts = +relay_from_hosts\n message = &quot;Your message have not return address&quot;</strong></pre><pre><strong><span style=\"color: #0000ff\"># Запрещаем тех, кто подставляет свой IP в HELO.</span><br />deny message&nbsp;&nbsp; = &quot;The use of IP is forbidden in HELO!&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp; hosts&nbsp;&nbsp;&nbsp;&nbsp; = *:!+relay_from_hosts<br />&nbsp;&nbsp;&nbsp;&nbsp; condition = ${if eq{$sender_helo_name}\\<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {$sender_host_address}{true}{false}}<br /><span style=\"color: #0000ff\"># Запрещаем использовать наш IP в HELO.\n</span>deny condition = ${if eq{$sender_helo_name}\\\n {$interface_address}{yes}{no}}\n hosts = !127.0.0.1 : !localhost : *\n message = &quot;The use of my IP is forbidden!&quot;\n\n<span style=\"color: #0000ff\"># Запрещаем прием почты с динамических хостов.\n</span>deny message = &quot;Dynamic hosts is forbidden!&quot;\n condition = ${if match{$sender_host_name}\\\n {dsl|dial|pool|peer|dhcp|cable} {yes}{no}}</strong></pre><pre><pre><strong><span style=\"color: #0000ff\"># Запрещаем прием почты с хостов, которые находятся в блэк-листах.\n</span>deny message = rejected because $sender_host_address \\\n is in a black list at $dnslist_domain\\n$dnslist_text\n hosts = !+relay_from_hosts\n !authenticated = *\n log_message = found in $dnslist_domain\n dnslists = bl.spamcop.net : \\\n cbl.abuseat.org : \\\n dnsbl.njabl.org : \\\n sbl-xbl.spamhaus.org : \\\n pbl.spamhaus.org\n\n<span style=\"color: #0000ff\"># Удерживание соединения. Метод борьбы со спамом.\n# Метод не допускается на высокозагруженых серверах,\n# поскольку в результате ему приходится удерживать\n# много открытых соединений.\n</span>warn\n<span style=\"color: #0000ff\"># ставим дефолтовую задержку в 25 секунд\n</span>set acl_m0 = 25s\nwarn\n<span style=\"color: #0000ff\"># ставим задержку в 0 секунд для своих сетей</span>\nhosts = +relay_from_hosts\nset acl_m0 = 0s\nwarn\n<span style=\"color: #0000ff\"># ставим задержку в 0 секунд для авторизованых пользователей</span>\nauthenticated = *\nset acl_m0 = 0s\n\nwarn\n<span style=\"color: #0000ff\"># пишем в логи задержку (если в этом есть необходимость)</span>\nlogwrite = Delay $acl_m0 for $sender_host_name \\\n[$sender_host_address] with HELO=$sender_helo_name. Mail \\\nfrom $sender_address to $local_part@$domain.\ndelay = $acl_m0 <span style=\"color: #0000ff\"># Проверка существования отправителя.\n</span>drop message = Rejected - Sender Verify Failed\n log_message = Rejected - Sender Verify Failed\n hosts = *\n !verify = sender/no_details/callout=2m,defer_ok\n !condition = ${if eq{$sender_verify_failure}{}}\n<span style=\"color: #0000ff\"># Проверка получателя в локальных доменах.\n</span>accept domains = +local_domains\n endpass\n message = $acl_verify_message\n verify = recipient</strong></pre></pre><pre><strong><span style=\"color: #0000ff\"># Проверяем получателя в релейных доменах.\n</span>accept domains = +relay_to_domains\n endpass<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message&nbsp; = &quot;Unrouteable address!&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; verify&nbsp;&nbsp; = recipient/callout=30s,defer_ok,use_postmaster<br /><span style=\"color: #0000ff\"># Разрешаем почту от хостов в релейных доменах.\n</span>accept hosts = +relay_from_hosts\naccept authenticated = *\ndeny message = relay not permitted\n\naccept\n\n\nacl_check_mime:</strong></pre><pre><pre><strong><font color=\"#0000ff\"># Запрещаем вложения определенных типов</font></strong></pre><pre><strong>deny message = Blacklisted file extension detected ($mime_filename)\ncondition = ${if match \\\n{${lc:$mime_filename}} \\\n{\\N(\\.exe|\\.pif|\\.bat|\\.scr|\\.lnk|\\.com|\\.vbs|\\.cpl)$\\N}{1}{0}}</strong></pre><pre><strong>accept </strong></pre></pre><pre><strong><span style=\"color: #0000ff\"># ACL проверки &quot;тела&quot; письма.\n</span>acl_check_data: \n\n<span style=\"color: #0000ff\"># Проверка антивирусом.\n</span>deny message = This message contains a virus ($malware_name).\ndemime = *\nmalware = */defer_ok\n\naccept\n\n<span style=\"color: #0000ff\">######################################################################\n# ROUTERS CONFIGURATION #\n# Specifies how addresses are handled #\n######################################################################\n# THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! #\n# An address is passed to each router in turn until it is accepted. #\n######################################################################</span></strong></pre><pre><strong>begin routers</strong></pre><pre><strong><span style=\"color: #0000ff\"># Поиск маршрута к хосту в DNS. Не проверяются 0.0.0.0 и 127.0.0.0/8!\n</span>dnslookup:\n driver = dnslookup\n domains = ! +local_domains\n transport = remote_smtp\n ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8\n no_more\n\n<span style=\"color: #0000ff\"># Почтовые алиасы (виртуальные адреса). Выборка делается из БД MySQL.</span>\nsystem_aliases:\n driver = redirect\n allow_fail\n allow_defer\n data = ${lookup mysql{SELECT recipients FROM aliases \\\n WHERE (local_part=\'${local_part}\' AND domain=\'${domain}\') \\\n OR (local_part=\'*\' AND domain=\'$domain\')ORDER BY local_part=\'*\' \\\n LIMIT 1}}\n\n<span style=\"color: #0000ff\"># Перенаправления почты в случае необходимости.\n</span>userforward:\n driver = redirect\n check_local_user=false\n file = /var/exim/$domain/$local_part/forward\n user = mailnull\n group = mail\n allow_filter\n no_verify\n no_expn\n check_ancestor\n file_transport = address_file\n pipe_transport = address_pipe\n reply_transport = address_reply\n condition = ${if exists{/var/exim/$domain/$local_part/forward}{yes}{no}}</strong></pre><pre><strong><span style=\"color: #0000ff\"># Настройка квотирования. Мы не жадные, но порядок должен быть :)\n# Выборка делается из БД MySQL.\n</span>virtual_user_quota_defer:\n driver = redirect\n domains = +local_domains\n condition = ${if and{\\\n {exists{/var/exim/$domain/$local_part}}\\\n {exists{/var/exim/$domain/$local_part/maildirsize}}\\\n {&gt;{GET_QUOTA}{0}}\\\n {&gt;={MAILDIR_SIZE}{GET_QUOTA}}\\\n } }\n data = :fail: Over quota!\n verify_sender = false\n allow_fail\n\n<span style=\"color: #0000ff\"># Принимаем почту для валидного пользователя. Выборка делается из БД MySQL.\n</span>virtual_localuser:\n driver = accept\n domains = ${lookup mysql{SELECT domain from domains \\\n WHERE domain=\'${domain}\'}}\n local_parts = ${lookup mysql{SELECT login from users \\\n WHERE login=\'${local_part}\' AND domain=\'${domain}\'}}\n transport = local_delivery\n cannot_route_message = Unknown user\n\n<span style=\"color: #0000ff\">######################################################################\n# TRANSPORTS CONFIGURATION #\n######################################################################\n# ORDER DOES NOT MATTER #\n# Only one appropriate transport is called for each delivery. #\n######################################################################</span></strong></pre><pre><strong>begin transports\n\n<span style=\"color: #0000ff\"># Доставка на удалённые хосты.\n</span>remote_smtp:\n driver = smtp\n interface = <span style=\"color: #ff0000\">91.221.84.10\n\n</span><span style=\"color: #0000ff\"># Локальная доставка.\n</span>local_delivery:\n driver = appendfile\n maildir_use_size_file\n check_string = &quot;&quot;\n create_directory\n delivery_date_add\n directory = ${lookup mysql{SELECT \\\n LOWER(CONCAT(\'/var/exim/$domain/\',login)) FROM users \\\n WHERE login=\'${local_part}\' AND domain=\'${domain}\';}}\n directory_mode = 770\n envelope_to_add\n group = mail\n maildir_format\n maildir_tag = ,S=$message_size\n message_prefix = &quot;&quot;\n message_suffix = &quot;&quot;\n mode = 0660\n quota = ${lookup mysql{SELECT quota FROM users \\\n WHERE login=\'${local_part}\' AND domain=\'${domain}\'}{${value}M}}\n quota_size_regex = S=(\\d+)$\n quota_warn_threshold = 80%\n return_path_add</strong></pre><pre><strong><span style=\"color: #0000ff\"># Транспорт а-ля &quot;труба&quot;\n</span>address_pipe:\n driver = pipe\n return_output\n\n<span style=\"color: #0000ff\"># Запись в файл.\n</span>address_file:\n driver = appendfile\n delivery_date_add\n envelope_to_add\n return_path_add</strong></pre><pre><strong><span style=\"color: #0000ff\"># Автоответчик.\n</span>address_reply:\n driver = autoreply\n\n<span style=\"color: #0000ff\"># В никуда...\n</span>null_transport:\n driver = appendfile\n file = /dev/null\n\n<span style=\"color: #0000ff\">######################################################################\n# RETRY CONFIGURATION #\n######################################################################</span></strong></pre><pre><strong>begin retry\n\n<span style=\"color: #0000ff\"># Настройка повтора недоставленных писем.\n</span>* quota\n* * F,2h,15m; G,16h,1h,1.5; F,4d,6h</strong></pre><pre><strong><span style=\"color: #0000ff\">######################################################################\n# REWRITE CONFIGURATION #\n######################################################################</span>\n\n<span style=\"color: #0000ff\"># Секция перезаписи адресов. Не использую.\n</span>begin rewrite</strong></pre><pre><strong><span style=\"color: #0000ff\">######################################################################\n# AUTHENTICATION CONFIGURATION #\n######################################################################</span>\n\nbegin authenticators</strong></pre><pre><strong><span style=\"color: #0000ff\"># Секция авторизации. Разные типы авторизации для разных почтовых клиентов.</span>\nfixed_login:\n driver = plaintext\n public_name = LOGIN\n server_prompts = Username:: : Password::\n server_condition = &quot;${if and { \\\n {!eq{$1}{}} \\\n {!eq{$2}{}} \\\n {crypteq{$2}{\\\\{crypt\\\\}${lookup mysql{SELECT \\\n password FROM users \\\n WHERE login=\'${local_part:$1}\' \\\n AND domain=\'${domain:$1}\' AND \\\n smtp_auth=\'1\'}{$value}fail}}} \\\n } {yes}{no}}&quot;\n server_set_id = $1\n\nfixed_plain:\n driver = plaintext\n public_name = PLAIN\n server_prompts = :\n server_condition = &quot;${if and { \\\n {!eq{$2}{}} \\\n {!eq{$3}{}} \\\n {crypteq{$3}{\\\\{crypt\\\\}${lookup mysql{SELECT \\\n password FROM users \\\n WHERE login=\'${local_part:$2}\' \\\n AND domain=\'${domain:$2}\' AND \\\n smtp_auth=\'1\'}{$value}fail}}} \\\n } {yes}{no}}&quot;\n server_set_id = $2\n\n<span style=\"color: #0000ff\"># End of Exim configuration file.\n</span></strong></pre></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">С&nbsp;конфигурационным файлом, кажется,&nbsp;разобрались. Следующий шаг - создание БД, &nbsp;пользователя этой&nbsp;БД и наполнение БД данными.</p>\n<p class=\"rtejustify\">Создадим пользователя MySQL и базу данных:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p>mysql&gt; <strong>create database exim;<br />\n </strong>Query OK, 1 row affected (0.00 sec)</p>\n<p>mysql&gt; <strong>grant all on exim.* to \'exim\'@\'localhost\' identified by \'<span style=\"color: #ff0000\">MySQL-pass-here</span>\';<br />\n </strong>Query OK, 1 row affected (0.00 sec)</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Скачиваем дамп базы данных&nbsp;и&nbsp;&quot;заливаем&quot;&nbsp;его в&nbsp;БД:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>fetch http://muff.kiev.ua/files/exim.sql</strong><br />\n # <strong>mysql -u exim -p<span style=\"color: #ff0000\">MySQL-pass-here</span><span style=\"color: #000000\"> exim &lt; exim.sql</span></strong></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Структура БД у нас есть. Теперь пора &quot;заполнить&quot; ее необходимыми данными. По очереди внесу по одной записи в каждую из таблиц.</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p>mysql&gt; <strong>use exim;<br />\n </strong>Reading table information for completion of table and column names<br />\n You can turn off this feature to get a quicker startup with -A</p>\n<p>Database changed<br />\n &nbsp;</p>\n<p>mysql&gt; <strong>INSERT INTO `exim`.`aliases` (`local_part`, `domain`, `recipients`)<br />\n </strong>&nbsp;&nbsp;&nbsp; -&gt; <strong>VALUES (\'<span style=\"color: #ff0000\">root</span>\', \'<span style=\"color: #ff0000\">ispalternativa.net.ua</span>\', \'<span style=\"color: #ff0000\"><span class=\"spamspan\"><span class=\"u\">muff</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span></span>\');<br />\n </strong>Query OK, 1 row affected (0.00 sec)</p>\n<p>\n mysql&gt; <strong>INSERT INTO `exim`.`blacklist` (`senders`, `when_added`)<br />\n </strong>&nbsp;&nbsp;&nbsp; -&gt; <strong>VALUES (\'<span style=\"color: #ff0000\"><span class=\"spamspan\"><span class=\"u\">elenafrits</span> [at] <span class=\"d\">km [dot] ru</span></span></span>\', CURDATE());<br />\n </strong>Query OK, 1 row affected (0.00 sec)</p>\n<p>\n mysql&gt; <strong>INSERT INTO `exim`.`blacklist_host` (`senders`, `when_added`)</strong><br />\n &nbsp;&nbsp;&nbsp; -&gt; <strong>VALUES (\'<span style=\"color: #ff0000\">12.134.36.100</span>\', CURDATE());<br />\n </strong>Query OK, 1 row affected (0.01 sec)</p>\n<p>\n mysql&gt;<strong> INSERT INTO `exim`.`domains` (`domain`, `type`)<br />\n </strong>&nbsp;&nbsp;&nbsp; -&gt; <strong>VALUES (\'<span style=\"color: #ff0000\">ispalternativa.net.ua</span>\', \'LOCAL\');<br />\n </strong>Query OK, 1 row affected (0.00 sec)</p>\n<p>\n mysql&gt; <strong>INSERT INTO `exim`.`users` (`login`, `name`, `password`, `uid`, `gid`, `domain`,<br />\n </strong>&nbsp;&nbsp;&nbsp; -&gt; <strong>`quota`, `status`, `smtp_auth`) VALUES (\'<span style=\"color: #ff0000\">muff</span>\', \'<span style=\"color: #ff0000\">Oleg Zinkov. System administrator</span>\',<br />\n </strong>&nbsp;&nbsp;&nbsp; -&gt; <strong>ENCRYPT(\'<span style=\"color: #ff0000\">password-here</span>\'), \'26\', \'6\', \'<span style=\"color: #ff0000\">ispalternativa.net.ua</span>\', \'<span style=\"color: #ff0000\">150</span>\', \'1\', \'<span style=\"color: #ff0000\">1</span>\');<br />\n </strong>Query OK, 1 row affected (0.00 sec)</p>\n<p>\n mysql&gt; <strong>INSERT INTO `exim`.`whitelist` (`senders`, `when_added`)<br />\n </strong>&nbsp;&nbsp;&nbsp; -&gt; <strong>VALUES (\'<span style=\"color: #ff0000\"><span class=\"spamspan\"><span class=\"u\">do-not-reply</span> [at] <span class=\"d\">livejournal [dot] com</span></span></span>\', CURDATE());<br />\n </strong>Query OK, 1 row affected (0.00 sec)</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Возьмемся за поддержку шифрования... Создадим самоподписной сертификат безопасности. Создадим каталог для сертификата и создадим сертификат,&nbsp;как таковой и немного обезопасим его:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>mkdir /etc/ssl/certs &amp;&amp; cd /etc/ssl/certs<br />\n </strong># <span class=\"Apple-style-span\" style=\"widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium \'Times New Roman\'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px\"><span class=\"Apple-style-span\" style=\"line-height: 16px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px\"><strong>openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/mail.pem -keyout /etc/ssl/certs/mail.pem</strong></span></span></p>\n<p><span class=\"Apple-style-span\" style=\"widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium \'Times New Roman\'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px\"><span class=\"Apple-style-span\" style=\"line-height: 16px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px\">Generating a 1024 bit RSA private key<br />\n ...........................................................................................++++++<br />\n ....................++++++<br />\n writing new private key to \'/etc/ssl/certs/mail.pem\'<br />\n -----<br />\n You are about to be asked to enter information that will be incorporated<br />\n into your certificate request.<br />\n What you are about to enter is what is called a Distinguished Name or a DN.<br />\n There are quite a few fields but you can leave some blank<br />\n For some fields there will be a default value,<br />\n If you enter \'.\', the field will be left blank.<br />\n -----<br />\n Country Name (2 letter code) [AU]:<strong>UA</strong><br />\n State or Province Name (full name) [Some-State]:<strong>Kiev region.<br />\n </strong>Locality Name (eg, city) []:<strong>Kiev</strong><br />\n Organization Name (eg, company) [Internet Widgits Pty Ltd]:<strong>ISP Alternativa<br />\n </strong>Organizational Unit Name (eg, section) []:<strong>IT Department<br />\n </strong>Common Name (eg, YOUR name) []:<span style=\"color: #ff0000\"><strong>mail.ispalternativa.net.ua<br />\n </strong></span>Email Address []:</span><strong><span class=\"Apple-style-span\" style=\"line-height: 16px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px\"><span class=\"spamspan\"><span class=\"u\">noc</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span></span></strong></span></p>\n<p><span class=\"Apple-style-span\" style=\"widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium \'Times New Roman\'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px\"><span class=\"Apple-style-span\" style=\"line-height: 16px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px\"># </span><strong><span class=\"Apple-style-span\" style=\"line-height: 16px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px\">chown mailnull:mail mail.pem</span></strong></span><br />\n <span class=\"Apple-style-span\" style=\"widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: medium \'Times New Roman\'; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px\"><span class=\"Apple-style-span\" style=\"line-height: 16px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px\"># </span><strong><span class=\"Apple-style-span\" style=\"line-height: 16px; border-collapse: collapse; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px\">chmod 440 mail.pem</span></strong></span></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Теперь пора создать каталог,&nbsp;где будет храниться почта. Ну и не нужно забывать о правах на каталог:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>mkdir /var/exim &amp;&amp; chown mailnull:mail /var/exim</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Также не стоит забывать о файле <strong>/etc/mail/mailer.conf</strong>. Отредактируем его до такого состояния:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td bgcolor=\"#cccccc\">\n<pre>\nsendmail /usr/local/sbin/exim\nsend-mail /usr/local/sbin/exim\nmailq /usr/local/sbin/exim -bp\nnewaliases /usr/local/sbin/exim -bi\nhoststat /usr/local/sbin/exim\npurgestat /usr/local/sbin/exim</pre></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Зададим параметры запуска <strong>Exim</strong>. Кстати,&nbsp;не стоит забывать про необходимость останова штатного <strong>Sendmail</strong> перед запуском <strong>Exim</strong>.</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>echo \'# Mail Server\' &gt;&gt; /etc/rc.conf</strong><br />\n # <strong>echo \'sendmail_enable=&quot;NONE&quot;\' &gt;&gt; /etc/rc.conf</strong><br />\n # <strong>echo \'exim_enable=&quot;YES&quot;\' &gt;&gt; /etc/rc.conf</strong><br />\n <strong># killall sendmail</strong><br />\n <strong># sh /usr/local/etc/rc.d/exim start</strong></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Если не напутать,&nbsp;то <strong>Exim </strong>должен корректно запуститься. После успешного запуска <strong>Exim</strong>-а в <strong>maillog</strong>-е можно обнаружить такую запись:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>Aug&nbsp; 9 02:46:30 billing exim[93613]: exim 4.76 daemon started: pid=93613, -q30m, listening for SMTP on [127.0.0.1]:25 [91.221.84.10]:25 and for SMTPS on [127.0.0.1]:465 [91.221.84.10]:465</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Выполним тестовою отправку письма,&nbsp;выполнив SMTP-диалог:</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td>\n<div># <strong>telnet localhost 25<br />\n </strong>Trying ::1...<br />\n Trying 127.0.0.1...<br />\n Connected to localhost.<br />\n Escape character is \'^]\'.<br />\n 220 mail.ispalternativa.net.ua ESMTP Exim<br />\n <strong>ehlo mail.ispalternativa.net.ua<br />\n </strong>250-mail.ispalternativa.net.ua Hello mail.ispalternativa.net.ua [127.0.0.1]<br />\n 250-SIZE 20971520<br />\n 250-PIPELINING<br />\n 250-AUTH LOGIN PLAIN<br />\n 250-STARTTLS<br />\n 250 HELP<br />\n <strong>mail from: </strong><strong><span class=\"spamspan\"><span class=\"u\">root</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span></strong><strong><br />\n </strong>250 OK<br />\n <strong>rcpt to: </strong><strong><span class=\"spamspan\"><span class=\"u\">muff</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span></strong><strong><br />\n </strong>250 Accepted<br />\n <strong>data</strong><br />\n 354 Enter message, ending with &quot;.&quot; on a line by itself<br />\n <strong>To: <span class=\"spamspan\"><span class=\"u\">muff</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span><br />\n From: <span class=\"spamspan\"><span class=\"u\">root</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span><br />\n Subject: TestMail</strong></div>\n<div>&nbsp;</div>\n<div><strong>Hi!<br />\n This is a test message.<br />\n .<br />\n </strong>250 OK id=1QqZsP-000PQO-Se<br />\n <strong>quit</strong><br />\n 221 mail.ispalternativa.net.ua closing connection<br />\n Connection closed by foreign host.</div>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Просмотрим в логах &quot;судьбу&quot; письма...</p>\n<table border=\"1\" cellspacing=\"1\" cellpadding=\"1\" width=\"100%\">\n<tbody>\n<tr>\n<td># <strong>cat /var/log/maillog | grep 1QqZsP-000PQO-Se<br />\n </strong>Aug&nbsp; 9 03:09:06 billing exim[97736]: 1QqZsP-000PQO-Se &lt;= <span class=\"spamspan\"><span class=\"u\">root</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span> H=(mail.ispalternativa.net.ua) [127.0.0.1] P=esmtp S=368 from &lt;<span class=\"spamspan\"><span class=\"u\">root</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span>&gt; for <span class=\"spamspan\"><span class=\"u\">muff</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span><br />\n Aug&nbsp; 9 03:09:06 billing exim[97759]: 1QqZsP-000PQO-Se =&gt; muff &lt;<span class=\"spamspan\"><span class=\"u\">muff</span> [at] <span class=\"d\">ispalternativa [dot] net [dot] ua</span></span>&gt; R=virtual_localuser T=local_delivery<br />\n Aug&nbsp; 9 03:09:06 billing exim[97759]: 1QqZsP-000PQO-Se Completed</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Кажется пора поздравлять себя с полноценным почтовым сервером. Следующий шаг - <a href=\"http://muff.kiev.ua/content/dovecot-vygrebaem-pochtu-iz-pochtovogo-yashchika\">настройка <strong>Dovecot</strong>-а</a>, чтобы пользователи смогли забрать почту с сервера.</p>\n<p class=\"rtejustify\">А пока советую ознакомиться с <a href=\"http://muff.kiev.ua/content/mx-tool-box\">этим инструментом</a>,&nbsp;и определить все ли в порядке с SMTP-сервером. У меня оказалось все в порядке.</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:000347a375eca83aff79287b2b263f82' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:5836c3010fa19c4fe27ae5d67d002a40' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Очень хорошая и полезная статья, в будущем пригодится. Автор - <img alt=\"\" src=\"http://muff.kiev.ua/modules/fckeditor/fckeditor/editor/images/smiley/msn/thumbs_up.gif\" />.</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:5836c3010fa19c4fe27ae5d67d002a40' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:954b183d3fd4879097a48675169d1dcb' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Спасибо...</p>\n<p class=\"rtejustify\">Сейчас работаю над продолжением: статья о настройкеDovecot-а&nbsp;(почту ведь нужно как-то доставить абоненту). Решил детально прокомментировать конфигурационный файл... Уже офигеваю: два дня работы,&nbsp;а перевел только половину <img alt=\"\" src=\"http://muff.kiev.ua/modules/fckeditor/fckeditor/editor/images/smiley/msn/confused_smile.gif\" /></p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:954b183d3fd4879097a48675169d1dcb' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:7fa4d4c233c3014f5ea3e803b9e471f6' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Привет...</p>\n<p>Подскажи как указать exim к адресу отправителя добавлять имя.</p>\n<p>Например уходит письмо с <span class=\"spamspan\"><span class=\"u\">test</span> [at] <span class=\"d\">test [dot] ru</span></span>, надо чтоб отправка была вида Иван Иваныч &lt;<span class=\"spamspan\"><span class=\"u\">test</span> [at] <span class=\"d\">test [dot] ru</span></span>&gt;.. правило каснется всех отправляемых писем</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:7fa4d4c233c3014f5ea3e803b9e471f6' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:0551885067e62b8f9d3ead440865030c' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Дык этим должна заниматься почтовая программа...</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:0551885067e62b8f9d3ead440865030c' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:35b40044d60df365ff059d3df5d14fd7' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;Добрый день.<br />\nПодскажите пожалуйста как правильно настроить почтовый сервер чтобы в Roundcube в папке входящие письма сортировались по подпапкам (по домену или по адресу отправителя)</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:35b40044d60df365ff059d3df5d14fd7' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:bd6af396c116548cb933013d84c49db4' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Здравствуйте.</p>\n<p class=\"rtejustify\">Для сортировки писем непосредственно на стороне сервера,&nbsp;необходимо в <strong>Dovecot</strong> настроить <strong>managesieve</strong>. А в <strong>Exim</strong> доставку писем в ящики пользователей выполнять через&nbsp;<strong>dovecot deliver</strong>. А&nbsp;к <strong>Roundcube</strong> необходимо &quot;прицепить&quot; плагин <strong>managesieve</strong>, в котором можно будет задавать правила сортировки.</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:bd6af396c116548cb933013d84c49db4' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b5e4f47334701156f7c5d373cdbfafc1' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>А не прикрусивали postfixadmin никто?</p>\n<p>К него своя структура быза, я так понял нкжно либо в postfix запросы переписвать либо в exim. Может кто- уже делал, поделитемь решением.</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:b5e4f47334701156f7c5d373cdbfafc1' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b9798b4936b8c5fc7e733121aeefeb35' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&lt;blockquote&gt;Скачиваем дамп базы данных&nbsp;и&nbsp;&quot;заливаем&quot;&nbsp;его в&nbsp;БД&lt;/blockquote&gt;</p>\n<p>Где скачиваем-то?</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:b9798b4936b8c5fc7e733121aeefeb35' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:6903fe677237c5866288cd17b882168c' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Фраза заканчивается двоеточием. А дальше комманды на загрузку и импорт БД:</p>\n<p>&nbsp;</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td><span style=\"background-color:rgb(255, 255, 255)\">#&nbsp;</span><strong>fetch http://muff.kiev.ua/files/exim.sql</strong><br />\n <span style=\"background-color:rgb(255, 255, 255)\">#&nbsp;</span><strong>mysql -u exim -p<span style=\"color:rgb(255, 0, 0)\">MySQL-pass-here</span>&nbsp;exim &lt; exim.sql</strong></td>\n</tr>\n</tbody>\n</table>\n<p>&nbsp;</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:6903fe677237c5866288cd17b882168c' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>&nbsp;</p>\n<p>&nbsp;</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:b1f58154e0889ad9e13f315115f79cf2' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:802f8a7ab782412ae8bcbc0adadf1679' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Это Вы публичным же ключом шифруете TLS? </p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:802f8a7ab782412ae8bcbc0adadf1679' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:5a8493c70ca33f569a26bf6977a67a45' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p>Добрый день!<br />\nЕсть вопрос по настройке почтового сервера.</p>\n<p>Сайт с которого осуществляется рассылка:<br />\nkrov-stroy.com<br />\nSPF<br />\nkrov-stroy.com.&nbsp;&nbsp;&nbsp;&nbsp; 3600&nbsp;&nbsp;&nbsp;&nbsp; TXT (текстовая запись)&nbsp;&nbsp;&nbsp;&nbsp; v=spf1 include:sp-teplica.ru ~all<br />\nPTR<br />\n150.67.213.62.in-addr.arpa.&nbsp;&nbsp;&nbsp;&nbsp; 86400&nbsp;&nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; PTR&nbsp;&nbsp;&nbsp;&nbsp; krov-stroy.com.<br />\nDKIM<br />\nemail._domainkey.krov-stroy.com.&nbsp;&nbsp;&nbsp;&nbsp; 3600&nbsp;&nbsp;&nbsp;&nbsp; TXT (текстовая запись) &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v=DKIM1; k=rsa; s=email; p=...<br />\n&nbsp;</p>\n<p>Почтовый сервер:</p>\n<p>sp-teplica.ru (Centos7+Exim 4.88+Dovecot+ и т.д.)<br />\nSPF<br />\nsp-teplica.ru.&nbsp;&nbsp;&nbsp;&nbsp; 3600&nbsp;&nbsp;&nbsp;&nbsp; TXT (текстовая запись)&nbsp;&nbsp;&nbsp;&nbsp; v=spf1 a mx ip4:217.23.138.134 ~all<br />\nPTR<br />\n134.138.23.217.in-addr.arpa.&nbsp;&nbsp;&nbsp;&nbsp; 57377 &nbsp;&nbsp;&nbsp; IN&nbsp;&nbsp;&nbsp;&nbsp; PTR&nbsp;&nbsp;&nbsp;&nbsp; sp-teplica.ru.<br />\nDKIM<br />\nemail._domainkey.sp-teplica.ru.&nbsp;&nbsp;&nbsp;&nbsp; 3600&nbsp;&nbsp;&nbsp;&nbsp; TXT (текстовая запись) &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v=DKIM1; k=rsa; s=email; p=...</p>\n<p>Кроме того в папку /etc/exim/ssl/ положен приватный ключ, которым подписывается сообщение от имени krov-stroy.com и внесены необходимые настройки в конфиг exim.<br />\nВ заголовках письма которое приходит на Mail.ru есть HELO - sp-teplica.ru. В заголовках на Яндексе и в Гугле HELO - отсутствует.</p>\n<p>После рассылки в Постмастере Гугла после рассылки наблюдаю данные<br />\nДоля прошедших DKIM - 100%<br />\nДоля прошедших SPF - 0%<br />\nДоля прошедших DMARC - 0%</p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:5a8493c70ca33f569a26bf6977a67a45' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a class=\"thickbox\" href=\"/files/imagepicker/1/wake_up_ua.png\"><img alt=\"Вставай, Україно!\" class=\"imgp_img\" src=\"/files/imagepicker/1/thumbs/wake_up_ua.png\" style=\"height:200px; width:150px\" /></a></p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:07243fc0252056071eaa62af8c18d662' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:cc913d232116f0426090404133377d88' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: UPDATE cache_filter SET data = '<p class=\"rtecenter\"><a href=\"http://muff.kiev.ua/rss.xml\"><img alt=\"RSS\" width=\"160\" height=\"60\" src=\"http://muff.kiev.ua/files/muf-rss.png\" /></a></p>\n', created = 1767342290, expire = 1767428690, headers = '', serialized = 0 WHERE cid = '2:d9a86123bfcbc57878743027b584400b' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 112.
  • user warning: Table './muffsql1/cache_filter' is marked as crashed and should be repaired query: SELECT data, created, headers, expire, serialized FROM cache_filter WHERE cid = '3:39649256b636e3d5ded656bc52bd8c01' in /usr/local/www/muff.kiev.ua/includes/cache.inc on line 27.
Версия для печатиОтправить другуPDF version

MTA Exim

Давно уже собирался написать статью о настройке почтового сервера, но все никак не находилось свободного времени, во время настройки очередного "почтовика". Сейчас же вроде не очень "подгоняют", соответственно попытаемся все подробно задокументировать.

Итак, исходные данные:

  • домен: ispalternativa.net.ua
  • IP-адрес сервера: 91.221.84.10
  • имя сервера: mail.ispalternativa.net.ua

Важно! Согласно RFC, необходимо, чтобы "прямая" и "обратная" запись в ДНС совпадали. Тоесть в нашем случае, необходимо чтобы запись mail.ispalternativa.net.ua "резолвилась" в IP-адрес 91.221.84.10, а PTR-запись 91.221.84.10 была установлена в mail.ispalternativa.net.ua.

Проверяем эти условия:

# host mail.ispalternativa.net.ua
mail.ispalternativa.net.ua has address 91.221.84.10

# host 91.221.84.10
10.84.221.91.in-addr.arpa domain name pointer
mail.ispalternativa.net.ua.

С ДНС-записями почти разобрались... Проверим еще, чтобы МХ-запись домена указывала на наш почтовый сервер:

# dig MX ispalternativa.net.ua

; <<>> DiG 9.6.2-P2 <<>> MX ispalternativa.net.ua
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57347
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 3

;; QUESTION SECTION:
;ispalternativa.net.ua.         IN      MX

;; ANSWER SECTION:
ispalternativa.net.ua.  2756    IN      MX      10 mail.ispalternativa.net.ua.
ispalternativa.net.ua.  2756    IN      MX      20 smtp.ispalternativa.net.ua.

;; AUTHORITY SECTION:
ispalternativa.net.ua.  2756    IN      NS      ns2.h26.hvosting.ua.
ispalternativa.net.ua.  2756    IN      NS      ns1.h26.hvosting.ua.

;; ADDITIONAL SECTION:
mail.ispalternativa.net.ua. 3600 IN     A       91.221.84.10
smtp.ispalternativa.net.ua. 2756 IN     A       91.200.40.26
ns1.h26.hvosting.ua.    344     IN      A       91.200.40.26
ns2.h26.hvosting.ua.    344     IN      A       62.149.29.26

;; Query time: 2 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Aug  7 00:15:03 2011
;; MSG SIZE  rcvd: 173

MX-запись указывает на наш сервер, здесь все в порядке. Пора приступать непосредственно к установке Exim.

Первым делом внесем некоторые изменения в /etc/make.conf. Добавим такую секцию:

# Задаем переменную - путь к каталогу портов
PORTSDIR?= /usr/ports
# EXIM
.if ${.CURDIR} == ${PORTSDIR}/mail/exim
LOG_FILE_PATH?= syslog
WITH_DEFAULT_CHARSET?= koi8-r
.endif

Дело в том, что по умолчанию Exim пишет логи в свой каталог, что не очень удобно. Указав же, что необходимо использовать syslog, логи будут писаться в /var/log/maillog. Добавляем именно в make.conf по той причине, что все опции, кроме логгирования, можно будет задать при запуске make config. Редактировать Makefile тоже не советую, поскольку при обновлении портов он просто будет перезаписан.

Подготовка к инсталляции окончена. Даем команду на установку.

# cd /usr/ports/mail/exim && make install clean && rehash

Выставляем необходимые опции сборки. Главное - не забыть включить поддержку MySQL...

Options for exim 4.76

[ ] ALT_CONFIG_PREFIX  Restrict the set of configuration files
[X] AUTH_CRAM_MD5      Enable CRAM-MD5 authentication mechanisms
[X] AUTH_DOVECOT       Enable Dovecot authentication mechanisms
[X] AUTH_PLAINTEXT     Enable plaintext authentication
[ ] AUTH_RADIUS        Enable radius (RFC 2865) authentication
[ ] AUTH_SASL          Enable use of Cyrus SASL auth library
[X] AUTH_SPA           Enable Secure Password Authentication
[X] CDB                Enable CDB-style lookups
[Х] CONTENT_SCAN       Enable exiscan email content scanner
[X] DAEMON             Install scripts to run as a daemon
[ ] DCC                Enable DCC at ACL support via dccifd
[ ] DEBUG              Build with debugging symbols
[X] DISABLE_D_OPT      Disable macros overrides using option -D
[X] DNSDB              Enable DNS-style lookups
[X] DSEARCH            Enable directory-list lookups
[X] EMBEDDED_PERL      Enable embedded Perl interpreter
[ ] EXIMON             Build eximon monitor (require XFree86!)
[X] ICONV              Enable header charset conversion
[ ] IPV6               Enable IPv6 support
[ ] KAS                Build with Kaspersky AntiSpam local scan 
[X] LMTP               RFC2033 SMTP over command pipe transport
[X] LSEARCH            Enable wildcarded-file lookups
[X] MAILDIR            Enable Maildir mailbox format
[X] MAILSTORE          Enable Mailstore mailbox format
[X] MBX                Enable MBX mailbox format
[X] MYSQL              Link against libmysqlclient library
[X] NIS                Enable NIS-style lookups
[X] OLD_DEMIME         Enable old, deprecated demime ACL
[ ] OPENLDAP           Link against libldap
[X] PAM                Enable PAM authentication mechanisms
[ ] PASSWD             Enable /etc/passwd lookups
[ ] PGSQL              Link against libpq
[X] READLINE           Enable readline(3) library
[ ] SASLAUTHD          Enable use of Cyrus SASL auth daemon
[ ] SA_EXIM            SA-Exim support
[ ] SO_1024            Build with Spamooborona-1024 local scan
[X] SPF                Enable Sender Policy Framework checking
[ ] SQLITE             Enable SQLite lookups
[X] SRS                Enable Sender Rewriting Scheme
[ ] SRS_ALT            Enable alternative SRS library
[X] SUID               Install the exim binary suid root
[ ] TCP_WRAPPERS       Enable /etc/hosts.allow access control
[X] TLS                Link against OpenSSL
[ ] WISHLIST           Include the unsupported patches
[ ] XCLIENT            Enable XCLIENT command in exim

Также не стоит забывать об антивирусной поддержке в Exim. Поэтому устанавливаем Clamav согласно этой статьи.

После установки и запуска Clamav приступаем к редактированию конфигурационного файла Exim. Постараюсь максимально комментировать строки, но не обещаю детальное описание. Скачать конфигурационный файл можно по этой ссылке.

А здесь вывод файла /usr/local/etc/exim/configure с комментариями.

############################################################################
#                  Runtime configuration file for Exim                     #
#                       MAIN CONFIGURATION SETTINGS                        #
############################################################################



# Имя хоста. Используется в HELO/EHLO. Необходимо, чтобы содержалось имя
# домена, для которого принимаем почту. Правильный вариант - чтобы этот
# параметр совпадал  с именем MX-записи.
primary_hostname = mail.ispalternativa.net.ua

# Список доменов, для которых будем принимать почту. В нашем случае
# выборка делается из БД MySQL.
domainlist local_domains = ${lookup mysql{SELECT domain FROM domains \
                        WHERE domain='${domain}' AND \
                        (type='LOCAL' OR type='VIRTUAL')}}



# Список доменов, для которых разрешен релей через данный сервер. Выборка
# делается из БД MySQL.
domainlist relay_to_domains = ${lookup mysql{SELECT domain FROM domains \
                        WHERE domain='${domain}' AND type='RELAY'}}

# Список отправителей, которых считать "спамерами". Выборка делается из БД
# MySQL. hostlist spamers = ${lookup mysql{SELECT senders FROM blacklist_host WHERE \
                        senders='${sender_host_address}'}}



# Список сетей, которым будет разрешена отправка без авторизации.
# Перечисляем сети, которые будут пользоваться даным сервером для
# отправки почты.
hostlist   relay_from_hosts = localhost : 127.0.0.1 : 91.221.84.0/23

# Выбираем данные из БД MySQL для поддержки квотирования.
GET_QUOTA=${lookup mysql{SELECT quota FROM users \
           WHERE login='${local_part}' AND domain='${domain}'}{${value}M}}



# Задаем квотирование.
MAILDIR_SIZE=${eval:${sg{${sg{${readfile{/var/exim/$domain/$local_part/maildirsize}\
                     {\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}0+500K}
# На каких портах будет "работать" Exim.
daemon_smtp_ports = 25 : 465 # Указываем, что на порту 465 будет TLS-шифрование. tls_on_connect_ports = 465
# Перечисляем, для каких хостов будет доступно TLS-шифрование.
tls_advertise_hosts = *

# Указываем путь к сертификату и ключу шифрования.
tls_certificate = /etc/ssl/certs/mail.pem
tls_privatekey = /etc/ssl/certs/mail.pem
# Выбираем, что будем логировать
# + - писать в логи,
# - - Не писать в логи.
# +all_parents - все входящие соединения
# +lost_incoming_connections - потеряные входящие соединения
# +received_sender - отправитель
# +received_recipients - получатель
# +smtp_confirmation - подтверждения SMTP
# +smtp_syntax_error - ошибки синтаксиса SMTP
# +smtp_connection - соединение SMTP
# +smtp_protocol_error - ошибки протокола SMTP
# -queue_run - работа очереди (замороженные мессаги)
log_selector = \
        +all_parents \
        +lost_incoming_connection \
        +received_sender \
        +received_recipients \
        +smtp_confirmation \
        +smtp_syntax_error \
        +smtp_connection \
        +smtp_protocol_error \
        -queue_run

# Убираем из логов временную метку Exim`a - её ставит syslogd
# Внимание! Если планируете использовать утилиту eximstats,
# необходимо установить в значение yes
syslog_timestamp = no

# Задаем acl для проверки почты.
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_mime = acl_check_mime
acl_smtp_data = acl_check_data

# "Цепляем" антивирус. Указываем путь к сокету Clamav.
av_scanner = clamd:/var/run/clamav/clamd.sock

# Доверенные пользователи.
trusted_users = www

# Имя домена добавляемое для локальных отправителей (пользователей системы). 
# Тоесть почта отправляемая от root, будет root@$qualify_domain.
qualify_domain = ispalternativa.net.ua

# Cписок IP-адресов интерфейсов, на которых ожидаются запросы.

local_interfaces = 127.0.0.1 : 91.221.84.10

# Принимать ли почту вида имя_пользователя@IP-адрес.
allow_domain_literals = false

# Имя пользователя и групы, от имени которых будет работать Exim.
exim_user = mailnull exim_group = mail

# В целях безопасности запрещаем работу от root-а.
never_users = root

# Когда доставка сообщения откладывается, Exim посылает предупреждающее
# письмо отправителю, с указанными интервалами.
delay_warning = 4h:8h:24h:48h

# При генерации сообщения об ошибка "вкладывать" не все сообщение, а 
# "кусок", указанного размера.
return_size_limit = 50k

# Резолвить DNS-имена перечисленных хостов.
host_lookup = *

# Таймаут для резолвинга идентификатора пользователя на удаленной машине.
rfc1413_hosts = * rfc1413_query_timeout = 0s

# Принудительна синхронизация команд. Не принимать команды от удаленного
# сервера "потоком".
smtp_enforce_sync = true
# Контроль повторяющихся строк логов.
syslog_duplication = false

# Разрешить, чтобы МХ указывал на IP-адрес.
allow_mx_to_ip
# Уничтожать недоставленные рикошеты, если они "старше" указанного времени.
ignore_bounce_errors_after = 2d

# Какой промежуток времени хранить "замороженные" сообщения.
timeout_frozen_after = 2d
# Максимальный размер письма.
message_size_limit = 20M

# Ограничение на максимальной количество одновременных входящих сообщений.
smtp_accept_max = 100
# Ограничение на максимальное количество сообщений в одной сесию.
smtp_accept_max_per_connection = 50

# Ограничение на максимальное количество сообщений с одного хоста.
smtp_accept_max_per_host = 20
# Количество соединений по стеку TCP/IP.
smtp_connect_backlog = 50

# Класть в очередь, при большем числе сообщений за одну сесию.
smtp_accept_queue_per_connection = 30
# Максимальное количество СМТП-доставок на одно сообщение.
remote_max_parallel = 15

# Разбиение каталога спула. Увеличивает производительность.
split_spool_directory = true
# "Приветствие" сервера.
smtp_banner = "$primary_hostname ESMTP Exim"
# Параметры соединения с БД MySQL: server/database/username/password.
hide mysql_servers = localhost/exim/exim/MySQL-pass-here ############################################################################ # ACL CONFIGURATION # # Specifies access control lists for incoming SMTP mail # ############################################################################
begin acl

acl_check_rcpt:

# Запрещаем письма содержащие в локальной части символы @; %; !; /; |.
deny message      = "Illegal characters are in an address."
     domains       = +local_domains
     local_parts   = ^[.] : ^.*[@%!/|]
# Запрещаем недопустимые символы для нелокальных получателей.
deny message      = "Illegal characters are in an address."
     domains       = !+local_domains
     local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

# Запрещаем прием почты с определенных доменов. С них жестко СПАМ идет.
# orange.fr
deny message   = "All email from *.orange.fr - discarded!"
     condition = ${if match{$sender_helo_name}{.orange.fr}{yes}{no}}
# mdp2.net
deny message   = "All email from *.mdp2.net - discarded!"
     condition = ${if match{$sender_helo_name}{.mdp2.net}{yes}{no}}
# mail.comcast.net
deny message   = "All email from *.mail.comcast.net - discarded!"
     condition = ${if match{$sender_helo_name}{.mail.comcast.net}{yes}{no}}
# libero.it
deny message   = "All email from *.libero.it - discarded!"
     condition = ${if match{$sender_helo_name}{.libero.it}{yes}{no}}
# ono.com
deny message   = "All email from *.ono.com - discarded!"
     condition = ${if match{$sender_helo_name}{.ono.com}{yes}{no}}
# wanadoo.fr
deny message   = "All email from *.wanadoo.fr - discarded!"
     condition = ${if match{$sender_helo_name}{.wanadoo.fr}{yes}{no}}
# Разрешаем отправку, если отправитель находится в "белом списке". Выборка # делается из БД MySQL. accept senders=${lookup mysql{SELECT senders FROM whitelist \ WHERE senders='${quote_mysql:$sender_address}' \ OR senders='*@${quote_mysql:$sender_address_domain}' LIMIT 1}}
# Запрещаем отправку тем, кто внесен в "черный список". Выборка делается из
# БД MySQL.
deny message = "Your address in banlist!"
        senders=${lookup mysql{SELECT senders FROM blacklist \
        WHERE senders='${quote_mysql:$sender_address}' \
        OR senders='*@${quote_mysql:$sender_address_domain}' LIMIT 1}}

# Запрещаем отправку тем, кто "достал" и приравнивается к спамеру. Выборка
# делается из БД MySQL.
deny hosts = +spamers
     message = "Host rejected by spamers list on rbl.ispalternativa.net.ua!"
# Разрешаем отправку авторизованным пользователям.
accept authenticated = *

# Запрещаем тех, кто не обменивается приветственными сообщениями (HELO/EHLO)
deny message       = "HELO/EHLO required by SMTP RFC"
     condition     = ${if eq{$sender_helo_name}{}{yes}{no}}
# Запрещаем тех, кто в HELO "отдает" только цифры.
deny condition     = ${if match{$sender_helo_name}{\N^\d+$\N}{yes}{no}}
     hosts         = !127.0.0.1:!localhost:*
     message       = "There can not be only numbers in HELO!"

# Запрещаем тех, кто не пишет отправителя.
deny condition     = ${if eq{$sender_address}{}{yes}{no}}
     hosts         = +relay_from_hosts
     message       = "Your message have not return address"
# Запрещаем тех, кто подставляет свой IP в HELO.
deny message   = "The use of IP is forbidden in HELO!"
     hosts     = *:!+relay_from_hosts
     condition = ${if eq{$sender_helo_name}\
                      {$sender_host_address}{true}{false}}
# Запрещаем использовать наш IP в HELO. deny condition = ${if eq{$sender_helo_name}\ {$interface_address}{yes}{no}} hosts = !127.0.0.1 : !localhost : * message = "The use of my IP is forbidden!" # Запрещаем прием почты с динамических хостов. deny message = "Dynamic hosts is forbidden!" condition = ${if match{$sender_host_name}\ {dsl|dial|pool|peer|dhcp|cable} {yes}{no}}
# Запрещаем прием почты с хостов, которые находятся в блэк-листах.
deny    message       = rejected because $sender_host_address \
        is in a black list at $dnslist_domain\n$dnslist_text
        hosts         = !+relay_from_hosts
        !authenticated = *
        log_message   = found in $dnslist_domain
        dnslists      = bl.spamcop.net : \
                        cbl.abuseat.org : \
                        dnsbl.njabl.org : \
                        sbl-xbl.spamhaus.org : \
                        pbl.spamhaus.org

# Удерживание соединения. Метод борьбы со спамом.
# Метод не допускается на высокозагруженых серверах,
# поскольку в результате ему приходится удерживать
# много открытых соединений.
warn
# ставим дефолтовую задержку в 25 секунд
set acl_m0 = 25s
warn
# ставим задержку в 0 секунд для своих сетей
hosts = +relay_from_hosts
set acl_m0 = 0s
warn
# ставим задержку в 0 секунд для авторизованых пользователей
authenticated = *
set acl_m0 = 0s

warn
# пишем в логи задержку (если в этом есть необходимость)
logwrite = Delay $acl_m0 for $sender_host_name \
[$sender_host_address] with HELO=$sender_helo_name. Mail \
from $sender_address to $local_part@$domain.
delay = $acl_m0 # Проверка существования отправителя.
drop   message     = Rejected - Sender Verify Failed
       log_message = Rejected - Sender Verify Failed
       hosts       = *
       !verify     = sender/no_details/callout=2m,defer_ok
       !condition  =  ${if eq{$sender_verify_failure}{}}
# Проверка получателя в локальных доменах.
accept domains    = +local_domains
       endpass
       message    = $acl_verify_message
       verify     = recipient
# Проверяем получателя в релейных доменах.
accept domains  = +relay_to_domains
       endpass
       message  = "Unrouteable address!"
       verify   = recipient/callout=30s,defer_ok,use_postmaster
# Разрешаем почту от хостов в релейных доменах. accept hosts = +relay_from_hosts accept authenticated = * deny message = relay not permitted accept acl_check_mime:
# Запрещаем вложения определенных типов
deny message = Blacklisted file extension detected ($mime_filename)
condition = ${if match \
{${lc:$mime_filename}} \
{\N(\.exe|\.pif|\.bat|\.scr|\.lnk|\.com|\.vbs|\.cpl)$\N}{1}{0}}
accept 
# ACL проверки "тела" письма.
acl_check_data: 

# Проверка антивирусом.
deny     message  = This message contains a virus ($malware_name).
demime   = *
malware  = */defer_ok

accept

######################################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
######################################################################
#     THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT!       #
# An address is passed to each router in turn until it is accepted.  #
######################################################################
begin routers
# Поиск маршрута к хосту в DNS. Не проверяются 0.0.0.0 и 127.0.0.0/8!
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

# Почтовые алиасы (виртуальные адреса). Выборка делается из БД MySQL.
system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup mysql{SELECT recipients FROM aliases \
   WHERE (local_part='${local_part}' AND domain='${domain}') \
   OR (local_part='*' AND domain='$domain')ORDER BY local_part='*' \
   LIMIT 1}}

# Перенаправления почты в случае необходимости.
userforward:
  driver = redirect
  check_local_user=false
  file = /var/exim/$domain/$local_part/forward
  user = mailnull
  group = mail
  allow_filter
  no_verify
  no_expn
  check_ancestor
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  condition = ${if exists{/var/exim/$domain/$local_part/forward}{yes}{no}}
# Настройка квотирования. Мы не жадные, но порядок должен быть :)
# Выборка делается из БД MySQL.
virtual_user_quota_defer:
  driver          = redirect
  domains         = +local_domains
  condition       = ${if and{\
                    {exists{/var/exim/$domain/$local_part}}\
                    {exists{/var/exim/$domain/$local_part/maildirsize}}\
                    {>{GET_QUOTA}{0}}\
                    {>={MAILDIR_SIZE}{GET_QUOTA}}\
                    } }
  data            = :fail: Over quota!
  verify_sender = false
  allow_fail

# Принимаем почту для валидного пользователя. Выборка делается из БД MySQL.
virtual_localuser:
  driver = accept
  domains = ${lookup mysql{SELECT domain from domains \
              WHERE domain='${domain}'}}
  local_parts = ${lookup mysql{SELECT login from users \
              WHERE login='${local_part}' AND domain='${domain}'}}
  transport = local_delivery
  cannot_route_message = Unknown user

######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################
begin transports

# Доставка на удалённые хосты.
remote_smtp:
  driver = smtp
  interface =  91.221.84.10

# Локальная доставка.
local_delivery:
  driver = appendfile
  maildir_use_size_file
  check_string = ""
  create_directory
  delivery_date_add
  directory = ${lookup mysql{SELECT \
             LOWER(CONCAT('/var/exim/$domain/',login)) FROM users \
                WHERE login='${local_part}' AND domain='${domain}';}}
  directory_mode = 770
  envelope_to_add
  group = mail
  maildir_format
  maildir_tag = ,S=$message_size
  message_prefix = ""
  message_suffix = ""
  mode = 0660
  quota = ${lookup mysql{SELECT quota FROM users \
          WHERE login='${local_part}' AND domain='${domain}'}{${value}M}}
  quota_size_regex = S=(\d+)$
  quota_warn_threshold = 80%
  return_path_add
# Транспорт а-ля "труба"
address_pipe:
   driver = pipe
   return_output

# Запись в файл.
address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add
# Автоответчик.
address_reply:
  driver = autoreply

# В никуда...
null_transport:
    driver = appendfile
    file = /dev/null

######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################
begin retry

# Настройка повтора недоставленных писем.
*                      quota
*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h
######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################

# Секция перезаписи адресов. Не использую.
begin rewrite
######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################

begin authenticators
# Секция авторизации. Разные типы авторизации для разных почтовых клиентов.
fixed_login:
 driver = plaintext
 public_name = LOGIN
 server_prompts = Username:: : Password::
 server_condition = "${if and { \
                      {!eq{$1}{}} \
                      {!eq{$2}{}} \
                      {crypteq{$2}{\\{crypt\\}${lookup mysql{SELECT \
                      password FROM users \
                      WHERE login='${local_part:$1}' \
                      AND domain='${domain:$1}' AND \
                      smtp_auth='1'}{$value}fail}}} \
                       } {yes}{no}}"
 server_set_id = $1

fixed_plain:
 driver = plaintext
 public_name = PLAIN
 server_prompts = :
 server_condition = "${if and { \
                      {!eq{$2}{}} \
                      {!eq{$3}{}} \
                      {crypteq{$3}{\\{crypt\\}${lookup mysql{SELECT \
                      password FROM users \
                      WHERE login='${local_part:$2}' \
                      AND domain='${domain:$2}' AND \
                      smtp_auth='1'}{$value}fail}}} \
                      } {yes}{no}}"
 server_set_id = $2

# End of Exim configuration file.

С конфигурационным файлом, кажется, разобрались. Следующий шаг - создание БД,  пользователя этой БД и наполнение БД данными.

Создадим пользователя MySQL и базу данных:

mysql> create database exim;
Query OK, 1 row affected (0.00 sec)

mysql> grant all on exim.* to 'exim'@'localhost' identified by 'MySQL-pass-here';
Query OK, 1 row affected (0.00 sec)

Скачиваем дамп базы данных и "заливаем" его в БД:

# fetch http://muff.kiev.ua/files/exim.sql
# mysql -u exim -pMySQL-pass-here exim < exim.sql

Структура БД у нас есть. Теперь пора "заполнить" ее необходимыми данными. По очереди внесу по одной записи в каждую из таблиц.

mysql> use exim;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
 

mysql> INSERT INTO `exim`.`aliases` (`local_part`, `domain`, `recipients`)
    -> VALUES ('root', 'ispalternativa.net.ua', 'muff [at] ispalternativa [dot] net [dot] ua');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `exim`.`blacklist` (`senders`, `when_added`)
    -> VALUES ('elenafrits [at] km [dot] ru', CURDATE());
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `exim`.`blacklist_host` (`senders`, `when_added`)
    -> VALUES ('12.134.36.100', CURDATE());
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO `exim`.`domains` (`domain`, `type`)
    -> VALUES ('ispalternativa.net.ua', 'LOCAL');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `exim`.`users` (`login`, `name`, `password`, `uid`, `gid`, `domain`,
    -> `quota`, `status`, `smtp_auth`) VALUES ('muff', 'Oleg Zinkov. System administrator',
    -> ENCRYPT('password-here'), '26', '6', 'ispalternativa.net.ua', '150', '1', '1');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `exim`.`whitelist` (`senders`, `when_added`)
    -> VALUES ('do-not-reply [at] livejournal [dot] com', CURDATE());
Query OK, 1 row affected (0.00 sec)

Возьмемся за поддержку шифрования... Создадим самоподписной сертификат безопасности. Создадим каталог для сертификата и создадим сертификат, как таковой и немного обезопасим его:

# mkdir /etc/ssl/certs && cd /etc/ssl/certs
# openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/mail.pem -keyout /etc/ssl/certs/mail.pem

Generating a 1024 bit RSA private key
...........................................................................................++++++
....................++++++
writing new private key to '/etc/ssl/certs/mail.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:UA
State or Province Name (full name) [Some-State]:Kiev region.
Locality Name (eg, city) []:Kiev
Organization Name (eg, company) [Internet Widgits Pty Ltd]:ISP Alternativa
Organizational Unit Name (eg, section) []:IT Department
Common Name (eg, YOUR name) []:mail.ispalternativa.net.ua
Email Address []:
noc [at] ispalternativa [dot] net [dot] ua

# chown mailnull:mail mail.pem
# chmod 440 mail.pem

Теперь пора создать каталог, где будет храниться почта. Ну и не нужно забывать о правах на каталог:

# mkdir /var/exim && chown mailnull:mail /var/exim

Также не стоит забывать о файле /etc/mail/mailer.conf. Отредактируем его до такого состояния:

sendmail        /usr/local/sbin/exim
send-mail       /usr/local/sbin/exim
mailq           /usr/local/sbin/exim -bp
newaliases      /usr/local/sbin/exim -bi
hoststat        /usr/local/sbin/exim
purgestat       /usr/local/sbin/exim

Зададим параметры запуска Exim. Кстати, не стоит забывать про необходимость останова штатного Sendmail перед запуском Exim.

# echo '# Mail Server' >> /etc/rc.conf
# echo 'sendmail_enable="NONE"' >> /etc/rc.conf
# echo 'exim_enable="YES"' >> /etc/rc.conf
# killall sendmail
# sh /usr/local/etc/rc.d/exim start

Если не напутать, то Exim должен корректно запуститься. После успешного запуска Exim-а в maillog-е можно обнаружить такую запись:

Aug  9 02:46:30 billing exim[93613]: exim 4.76 daemon started: pid=93613, -q30m, listening for SMTP on [127.0.0.1]:25 [91.221.84.10]:25 and for SMTPS on [127.0.0.1]:465 [91.221.84.10]:465

Выполним тестовою отправку письма, выполнив SMTP-диалог:

# telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 mail.ispalternativa.net.ua ESMTP Exim
ehlo mail.ispalternativa.net.ua
250-mail.ispalternativa.net.ua Hello mail.ispalternativa.net.ua [127.0.0.1]
250-SIZE 20971520
250-PIPELINING
250-AUTH LOGIN PLAIN
250-STARTTLS
250 HELP
mail from: root [at] ispalternativa [dot] net [dot] ua
250 OK
rcpt to: muff [at] ispalternativa [dot] net [dot] ua
250 Accepted
data
354 Enter message, ending with "." on a line by itself
To: muff [at] ispalternativa [dot] net [dot] ua
From: root [at] ispalternativa [dot] net [dot] ua
Subject: TestMail
 
Hi!
This is a test message.
.
250 OK id=1QqZsP-000PQO-Se
quit
221 mail.ispalternativa.net.ua closing connection
Connection closed by foreign host.

Просмотрим в логах "судьбу" письма...

# cat /var/log/maillog | grep 1QqZsP-000PQO-Se
Aug  9 03:09:06 billing exim[97736]: 1QqZsP-000PQO-Se <= root [at] ispalternativa [dot] net [dot] ua H=(mail.ispalternativa.net.ua) [127.0.0.1] P=esmtp S=368 from <root [at] ispalternativa [dot] net [dot] ua> for muff [at] ispalternativa [dot] net [dot] ua
Aug  9 03:09:06 billing exim[97759]: 1QqZsP-000PQO-Se => muff <muff [at] ispalternativa [dot] net [dot] ua> R=virtual_localuser T=local_delivery
Aug  9 03:09:06 billing exim[97759]: 1QqZsP-000PQO-Se Completed

Кажется пора поздравлять себя с полноценным почтовым сервером. Следующий шаг - настройка Dovecot, чтобы пользователи смогли забрать почту с сервера.

А пока советую ознакомиться с этим инструментом, и определить все ли в порядке с SMTP-сервером. У меня оказалось все в порядке.

Ваша оценка: Нет Средняя: 4.1 (18 голосов)

Очень хорошая и полезная

Очень хорошая и полезная статья, в будущем пригодится. Автор - .

Спасибо... Сейчас работаю над

Спасибо...

Сейчас работаю над продолжением: статья о настройкеDovecot-а (почту ведь нужно как-то доставить абоненту). Решил детально прокомментировать конфигурационный файл... Уже офигеваю: два дня работы, а перевел только половину

Re: Exim - настройка почтового сервера на базе Exim с ...

Привет...

Подскажи как указать exim к адресу отправителя добавлять имя.

Например уходит письмо с test [at] test [dot] ru, надо чтоб отправка была вида Иван Иваныч <test [at] test [dot] ru>.. правило каснется всех отправляемых писем

Re: Exim - настройка почтового сервера на базе Exim с ...

Дык этим должна заниматься почтовая программа...

Re: Exim - настройка почтового сервера на базе Exim с ...

 Добрый день.
Подскажите пожалуйста как правильно настроить почтовый сервер чтобы в Roundcube в папке входящие письма сортировались по подпапкам (по домену или по адресу отправителя)

Re: Exim - настройка почтового сервера на базе Exim с ...

Здравствуйте.

Для сортировки писем непосредственно на стороне сервера, необходимо в Dovecot настроить managesieve. А в Exim доставку писем в ящики пользователей выполнять через dovecot deliver. А к Roundcube необходимо "прицепить" плагин managesieve, в котором можно будет задавать правила сортировки.

Re: Exim - настройка почтового сервера на базе Exim с ...

А не прикрусивали postfixadmin никто?

К него своя структура быза, я так понял нкжно либо в postfix запросы переписвать либо в exim. Может кто- уже делал, поделитемь решением.

Re: Exim - настройка почтового сервера на базе Exim с ...

<blockquote>Скачиваем дамп базы данных и "заливаем" его в БД</blockquote>

Где скачиваем-то?

Re: Exim - настройка почтового сервера на базе Exim с ...

Фраза заканчивается двоеточием. А дальше комманды на загрузку и импорт БД:

 

fetch http://muff.kiev.ua/files/exim.sql
mysql -u exim -pMySQL-pass-here exim < exim.sql

 

Re: Exim - настройка почтового сервера на базе Exim с ...

Это Вы публичным же ключом шифруете TLS?

Re: Exim - настройка почтового сервера на базе Exim с ...

Добрый день!
Есть вопрос по настройке почтового сервера.

Сайт с которого осуществляется рассылка:
krov-stroy.com
SPF
krov-stroy.com.     3600     TXT (текстовая запись)     v=spf1 include:sp-teplica.ru ~all
PTR
150.67.213.62.in-addr.arpa.     86400     IN     PTR     krov-stroy.com.
DKIM
email._domainkey.krov-stroy.com.     3600     TXT (текстовая запись)          v=DKIM1; k=rsa; s=email; p=...
 

Почтовый сервер:

sp-teplica.ru (Centos7+Exim 4.88+Dovecot+ и т.д.)
SPF
sp-teplica.ru.     3600     TXT (текстовая запись)     v=spf1 a mx ip4:217.23.138.134 ~all
PTR
134.138.23.217.in-addr.arpa.     57377     IN     PTR     sp-teplica.ru.
DKIM
email._domainkey.sp-teplica.ru.     3600     TXT (текстовая запись)          v=DKIM1; k=rsa; s=email; p=...

Кроме того в папку /etc/exim/ssl/ положен приватный ключ, которым подписывается сообщение от имени krov-stroy.com и внесены необходимые настройки в конфиг exim.
В заголовках письма которое приходит на Mail.ru есть HELO - sp-teplica.ru. В заголовках на Яндексе и в Гугле HELO - отсутствует.

После рассылки в Постмастере Гугла после рассылки наблюдаю данные
Доля прошедших DKIM - 100%
Доля прошедших SPF - 0%
Доля прошедших DMARC - 0%

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вставай, Україно!

Литература

4 Mb - это не память. Это склероз.