Exim - настройка вторичного mail exchanger

  • 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:082cdc8d5ca71b848e95a26f56bce092' 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=\"Exim logo\" src=\"http://muff.kiev.ua/files/exim.png\" style=\"height:105px; width:140px\" /></p>\n<p class=\"rtejustify\">Переносил вторичный <strong>mail exchanger (MX)</strong> на новый сервер. Решил выложить инфу и конфиги - еще пригодится...</p>\n<p class=\"rtejustify\">Исходные данные:</p>\n<ul>\n<li class=\"rtejustify\">Hostname: <strong>mx2.kyivlink.com</strong></li>\n<li class=\"rtejustify\">IP: <strong>195.12.59.26</strong></li>\n<li class=\"rtejustify\">Domain: <strong>kyivlink.com</strong></li>\n</ul>\n<p class=\"rtejustify\">Проверяем, куда указывают записи <strong>mail exchanger</strong> домена <strong>kyivlink.com</strong> (сервер мультидоменный, но тестировать будем на этом домене):</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>host -t mx kyivlink.com</strong><br />\n kyivlink.com mail is handled by <span style=\"color:#FF0000\">10 mail.kyivlink.com.</span><br />\n kyivlink.com mail is handled by <span style=\"color:#FF0000\">20 mx2.kyivlink.com.</span></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\"><span style=\"color:#FF0000\"><strong>Важно!</strong></span> Необходимо, чтобы &quot;прямая&quot; и &quot;обратная&quot; запись в <strong>DNS</strong> совпадали. Тоесть в нашем случае,&nbsp;необходимо чтобы запись <strong>mx2.kyivlink.com</strong> &quot;резолвилась&quot; в IP-адрес <strong>195.12.59.26</strong>, а <strong>PTR</strong>-запись для IP <strong>195.12.59.26</strong> была установлена в <strong>mx2.kyivlink.com</strong>.</p>\n<p class=\"rtejustify\">Проверим, выполняются ли эти условия:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>host mx2.kyivlink.com.</strong><br />\n mx2.kyivlink.com has address <span style=\"color:#FF0000\">195.12.59.26</span></p>\n<p># <strong>host 195.12.59.26</strong><br />\n 26.59.12.195.in-addr.arpa domain name pointer <span style=\"color:#FF0000\">mx2.kyivlink.com.</span></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">В <strong>DNS</strong>-записях все в порядке. Приступим непосредственно к настройке <strong>Exim</strong>.</p>\n<p class=\"rtejustify\">Внесем в <strong>/etc/make.conf</strong> следующий блок:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>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>Виполним установку <strong>Exim</strong> из системы портов:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"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>При сборке указываем необходимость сборки с поддержкой <strong>MySQL</strong>:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>[x] MYSQL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable mysql lookups<br />\n [x] SPF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Enable Sender Policy Framework checking</td>\n</tr>\n</tbody>\n</table>\n<p>По завершению установки выводится список рекомендуемых действий:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\n<p>To use Exim instead of sendmail on startup:</p>\n<p>*) Clear the sendmail queue and stop the sendmail daemon.<br />\n *) Adjust mailer.conf(5) as appropriate.<br />\n *) Set the &#39;sendmail_enable&#39; rc.conf(5) variable to &#39;NONE&#39;.<br />\n *) Set the &#39;daily_status_include_submit_mailq&#39; and<br />\n &nbsp;&nbsp; &#39;daily_clean_hoststat_enable&#39; periodic.conf(5)<br />\n &nbsp;&nbsp; variables to &#39;NO&#39;.<br />\n *) Consider setting &#39;daily_queuerun_enable&#39; and<br />\n &nbsp;&nbsp; &#39;daily_submit_queuerun&#39; to &quot;NO&quot; in periodic.conf(5),<br />\n &nbsp;&nbsp; if you intend to manage queue runners / deliveries closely.<br />\n *) Set the &#39;exim_enable&#39; rc.conf(5) variable to &#39;YES&#39;.<br />\n *) Start exim with &#39;/usr/local/etc/rc.d/exim start&#39;.</p>\n<p>You may also want to configure newsyslog(8) to rotate Exim log files:</p>\n<p>/var/log/exim/mainlog&nbsp;&nbsp; mailnull:mail 640 7 * @T00 ZN<br />\n /var/log/exim/rejectlog mailnull:mail 640 7 * @T00 ZN</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Относительно настройки ротации логов (в конце рекомендаций) - можно пропустить этот пункт, поскольку в опциях сборки указывали, что логировние будет выполняться с помощью <strong>syslog</strong>, тоесть логирование будет выполняться в <strong>maillog</strong>, настройка ротации которого уже выполнена.</p>\n<p class=\"rtejustify\">А вот остальные рекомендации стоит выполнить.</p>\n<p class=\"rtejustify\">Останавливаем <strong>sendmail</strong> и отключаем его поддержку в <strong>rc.conf</strong>:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\n<p># <strong>sh /etc/rc.d/sendmail forcestop</strong><br />\n # <strong>echo &#39;# Disable Sendmail&#39; &gt;&gt; /etc/rc.conf</strong><br />\n # <strong>echo &#39;sendmail_enable=&quot;NONE&quot;&#39; &gt;&gt; /etc/rc.conf</strong></p>\n</td>\n</tr>\n</tbody>\n</table>\n<p>Файл <strong>/etc/mail/mailer.conf</strong> приводим к следующему состоянию:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\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>Настраиваем <strong>periodic.conf</strong>:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>echo &#39;daily_status_include_submit_mailq=&quot;NO&quot;&#39; &gt;&gt; /etc/periodic.conf</strong><br />\n # <strong>echo &#39;daily_clean_hoststat_enable=&quot;NO&quot;&#39; &gt;&gt; /etc/periodic.conf</strong><br />\n # <strong>echo &#39;daily_queuerun_enable=&quot;NO&quot;&#39; &gt;&gt; /etc/periodic.conf</strong><br />\n # <strong>echo &#39;daily_submit_queuerun=&quot;NO&quot;&#39; &gt;&gt; /etc/periodic.conf</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\">Остается только добавить поддержку <strong>Exim</strong> в <strong>rc.conf</strong> и запустить <strong>Exim</strong>. Однако, предварительно необходимо его настроить.</p>\n<p class=\"rtejustify\">Отталкиваемся от того, что <strong><a href=\"http://muff.kiev.ua/content/mysql-ustanovka-i-bazovaya-nastroika\">MySQL</a></strong> и <a href=\"http://muff.kiev.ua/content/clamav-antivirusnaya-zashchita-servera\"><strong>Clamav</strong></a> установлены, настроены и работают.</p>\n<p class=\"rtejustify\">Отредактируем <strong>/usr/local/etc/exim/configure</strong> до следующего содержания:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td style=\"background-color:rgb(51, 51, 51)\">\n<pre>\n<span style=\"color:#00FF00\"><strong>######################################################################\n# Runtime configuration file for Exim #\n######################################################################\n######################################################################\n# MAIN CONFIGURATION SETTINGS #\n######################################################################</strong></span><span style=\"color:#00FFFF\"><strong>\n\nGREYLIST_ENABLED_GREY = yes\nGREYLIST_INITIAL_DELAY = 15 MINUTE\nGREYLIST_INITIAL_LIFETIME = 4 HOUR\nGREYLIST_WHITE_LIFETIME = 12 DAY\nGREYLIST_BOUNCE_LIFETIME = 7 DAY\nGREYLIST_RECORD_LIFETIME = 30 DAY\nGREYLIST_TABLE = greylist\n\n.ifdef GREYLIST_ENABLED_GREY\n GREYLIST_TEST = SELECT CASE \\\n WHEN now() &gt; block_expires THEN &quot;accepted&quot; \\\n ELSE &quot;deferred&quot; \\\n END AS result, id \\\n FROM GREYLIST_TABLE \\\n WHERE (now() &lt; record_expires) \\\n AND (sender_type = ${if def:sender_address_domain{&#39;NORMAL&#39;}{&#39;BOUNCE&#39;} }) \\\n AND (sender = &#39;${quote_mysql:${if def:sender_address_domain{$sender_address_domain}{${domain:$h_from:}} }}&#39;) \\\n AND (recipient = &#39;${quote_mysql:${if def:domain{$domain}{${domain:$h_to:}} }}&#39;) \\\n AND (relay_ip = &#39;${quote_mysql:${mask:$sender_host_address/32}}&#39;) \\\n ORDER BY result DESC LIMIT 1\n\nGREYLIST_ADD = REPLACE INTO GREYLIST_TABLE \\\n (relay_ip, sender_type, sender, recipient, block_expires, \\\n record_expires, create_time, type) \\\n VALUES ( &#39;${quote_mysql:${mask:$sender_host_address/32}}&#39;, \\\n ${if def:sender_address_domain{&#39;NORMAL&#39;}{&#39;BOUNCE&#39;}}, \\\n &#39;${quote_mysql:${if def:sender_address_domain{$sender_address_domain}{${domain:$h_from:}} }}&#39;, \\\n &#39;${quote_mysql:${if def:domain{$domain}{${domain:$h_to:}} }}&#39;, \\\n DATE_ADD(now(), INTERVAL GREYLIST_INITIAL_DELAY), \\\n DATE_ADD(now(), INTERVAL GREYLIST_INITIAL_LIFETIME), \\\n now(), \\\n &#39;AUTO&#39; \\\n )\n\n GREYLIST_DEFER_HIT = UPDATE GREYLIST_TABLE \\\n SET blockcount=blockcount+1, last_block=now() \\\n WHERE id = $acl_m9\n\n GREYLIST_OK_COUNT = UPDATE GREYLIST_TABLE \\\n SET passcount=passcount+1, last_pass=now() \\\n WHERE id = $acl_m9\n\n GREYLIST_OK_NEWTIME = UPDATE GREYLIST_TABLE \\\n SET record_expires = DATE_ADD(now(), INTERVAL GREYLIST_WHITE_LIFETIME) \\\n WHERE id = $acl_m9 AND type=&#39;AUTO&#39;\n\n GREYLIST_OK_BOUNCE = UPDATE GREYLIST_TABLE \\\n SET record_expires = DATE_ADD(now(), INTERVAL GREYLIST_BOUNCE_LIFETIME) \\\n WHERE id = $acl_m9 AND type=&#39;AUTO&#39;\n GREYLIST_CLEAN = DELETE FROM GREYLIST_TABLE \\\n WHERE (DATE_ADD(record_expires, INTERVAL GREYLIST_RECORD_LIFETIME) &lt; now()) AND (type=&#39;AUTO&#39;)\n.endif\n\nprimary_hostname = </strong></span><span style=\"color:#FF0000\"><strong>mx2.kyivlink.com</strong></span><span style=\"color:#00FFFF\"><strong>\n\ndomainlist local_domains = ${lookup mysql{SELECT domain FROM domains \\\n WHERE domain=&#39;${domain}&#39; AND \\\n (type=&#39;LOCAL&#39; OR type=&#39;VIRTUAL&#39;)}}\n\ndomainlist relay_to_domains = ${lookup mysql{SELECT domain FROM domains \\\n WHERE domain=&#39;${domain}&#39; AND type=&#39;RELAY&#39;}}\n\nhostlist spamers = ${lookup mysql{SELECT senders FROM blacklist_host WHERE senders=&#39;${sender_host_address}&#39;}}\n\nhostlist relay_from_hosts = localhost\n\nauth_advertise_hosts = *\ndaemon_smtp_ports = 25\nlog_selector = \\\n +all_parents \\\n +lost_incoming_connection \\\n +received_sender \\\n +received_recipients \\\n +smtp_confirmation \\\n +smtp_syntax_error \\\n +smtp_protocol_error \\\n -queue_run\n\nacl_smtp_rcpt = acl_check_rcpt\nacl_smtp_data = acl_check_data\nav_scanner = clamd:/var/run/clamav/clamd.sock\nqualify_domain = </strong></span><span style=\"color:#FF0000\"><strong>mx2.kyivlink.com</strong></span><span style=\"color:#00FFFF\"><strong>\nlocal_interfaces = </strong></span><span style=\"color:#FF0000\"><strong>195.12.59.26</strong></span><span style=\"color:#00FFFF\"><strong>\n\nallow_domain_literals = false\n\nexim_user = mailnull\nexim_group = mail\nnever_users = root\n\nhost_lookup = *\nrfc1413_hosts = *\nrfc1413_query_timeout = 5s\n\nsyslog_duplication = false\n\nignore_bounce_errors_after = 5d\ntimeout_frozen_after = 7d\nmessage_size_limit = 20M\nrecipients_max = 50\nsmtp_accept_max = 150\nsmtp_accept_max_per_connection = 20\nsmtp_accept_max_per_host = 20\nsmtp_connect_backlog = 50\nsmtp_accept_queue_per_connection = 30\nsplit_spool_directory = true\nremote_max_parallel = 15\nsmtp_banner = &quot;</strong></span><span style=\"color:#FF0000\"><strong>MX2.KYIVLINK.COM</strong></span><span style=\"color:#00FFFF\"><strong> ESMTP&quot;\n\nhide mysql_servers = localhost/exim/exim/</strong></span><span style=\"color:#FF0000\"><strong>MYSQL_PASS_HERE</strong></span><span style=\"color:#00FFFF\"><strong>\n\n</strong></span><span style=\"color:#00FF00\"><strong>######################################################################\n# ACL CONFIGURATION #\n# Specifies access control lists for incoming SMTP mail #\n######################################################################</strong></span><span style=\"color:#00FFFF\"><strong>\n\nbegin acl\n\n.ifdef GREYLIST_ENABLED_GREY\n greylist_acl:\n </strong></span><span style=\"color:#00FF00\"><strong># clean greylist records as 09:3xBRST 10:3xBRDT (horario normal)</strong></span><span style=\"color:#00FFFF\"><strong>\n warn condition = ${if eq {${substr{8}{4}{$tod_zulu} }} {0100}{yes}{no}}\n set acl_m4 = ${lookup mysql{GREYLIST_CLEAN}}\n</strong></span><span style=\"color:#00FF00\"><strong> # For regular deliveries, check greylist.\n # check greylist tuple, returning &quot;accepted&quot;, &quot;deferred&quot; or &quot;unknown&quot;\n # in acl_m8, and the record id in acl_m9</strong></span><span style=\"color:#00FFFF\"><strong>\n\n warn set acl_m8 = ${lookup mysql{GREYLIST_TEST}{$value}{result=unknown}}\n </strong></span><span style=\"color:#00FF00\"><strong># here acl_m8 = &quot;result=x id=y&quot;</strong></span><span style=\"color:#00FFFF\"><strong>\n\n set acl_m9 = ${extract{id}{$acl_m8}{$value}{-1}}\n </strong></span><span style=\"color:#00FF00\"><strong># now acl_m9 contains the record id (or -1)</strong></span><span style=\"color:#00FFFF\"><strong>\n\n set acl_m8 = ${extract{result}{$acl_m8}{$value}{unknown}}\n </strong></span><span style=\"color:#00FF00\"><strong># now acl_m8 contains unknown/deferred/accepted<span style=\"color:#00FFFF\"><strong>\n\n </strong></span># check if we know a certain triple, add and defer message if not</strong></span><span style=\"color:#00FFFF\"><strong>\n accept\n </strong></span><span style=\"color:#00FF00\"><strong># if above check returned unknown (no record yet)</strong></span><span style=\"color:#00FFFF\"><strong>\n condition = ${if eq {$acl_m8} {unknown} {1}}\n </strong></span><span style=\"color:#00FF00\"><strong># then also add a record</strong></span><span style=\"color:#00FFFF\"><strong>\n condition = ${lookup mysql{GREYLIST_ADD}{yes}{no}}\n\n </strong></span><span style=\"color:#00FF00\"><strong># check if the triple is still blocked</strong></span><span style=\"color:#00FFFF\"><strong>\n accept\n </strong></span><span style=\"color:#00FF00\"><strong># if above check returned deferred then defer</strong></span><span style=\"color:#00FFFF\"><strong>\n condition = ${if eq{$acl_m8} {deferred} {1}}\n </strong></span><span style=\"color:#00FF00\"><strong># and note it down</strong></span><span style=\"color:#00FFFF\"><strong>\n condition = ${lookup mysql{GREYLIST_DEFER_HIT}{yes}{yes}}\n\n </strong></span><span style=\"color:#00FF00\"><strong># use a warn verb to count records that were hit</strong></span><span style=\"color:#00FFFF\"><strong>\n warn condition = ${lookup mysql{GREYLIST_OK_COUNT}}\n\n </strong></span><span style=\"color:#00FF00\"><strong># use a warn verb to set a new expire time on automatic records,\n # but only if the mail was not a bounce, otherwise set to now().</strong></span><span style=\"color:#00FFFF\"><strong>\n warn !senders = : postmaster@* : Mailer-Daemon@*\n condition = ${lookup mysql{GREYLIST_OK_NEWTIME}}\n warn senders = : postmaster@* : Mailer-Daemon@*\n condition = ${lookup mysql{GREYLIST_OK_BOUNCE}}\n deny\n.endif\n\nacl_check_rcpt:\n accept hosts = +relay_from_hosts\n\n deny domains = +local_domains\n local_parts = ^[.] : ^.*[@%!/|]\n\n deny domains = !+local_domains\n local_parts = ^[./|] : ^.*[@%!] : ^.*/\\\\.\\\\./\n\n accept local_parts = postmaster\n domains = +local_domains\n\n deny message = HELO/EHLO required by SMTP RFC\n condition = ${if eq{$sender_helo_name}{}{yes}{no}}\n\n</strong></span><span style=\"color:#00FF00\"><strong># orange.fr war :)</strong></span><span style=\"color:#00FFFF\"><strong>\n deny message = all email from *.orange.fr - discarded!\n condition = ${if match{$sender_helo_name}{.orange.fr}{yes}{no}}\n\n</strong></span><span style=\"color:#00FF00\"><strong># .bezeqint.net</strong></span><span style=\"color:#00FFFF\"><strong>\n deny message = all email from *.bezeqint.net - discarded!\n condition = ${if match{$sender_helo_name}{.bezeqint.net}{yes}{no}}\n\n</strong></span><span style=\"color:#00FF00\"><strong># .libero.it</strong></span><span style=\"color:#00FFFF\"><strong>\n deny message = all email from *.libero.it - discarded!\n condition = ${if match{$sender_helo_name}{.libero.it}{yes}{no}}\n\n</strong></span><span style=\"color:#00FF00\"><strong># .ono.com</strong></span><span style=\"color:#00FFFF\"><strong>\n deny message = all email from *.ono.com - discarded!\n condition = ${if match{$sender_helo_name}{.ono.com}{yes}{no}}\n\n</strong></span><span style=\"color:#00FF00\"># isp.novis.pt</span><span style=\"color:#00FFFF\">\n deny message = all email from *.isp.novis.pt - discarded!\n condition = ${if match{$sender_helo_name}{.isp.novis.pt}{yes}{no}}\n\n deny message= Yoy address in banlist!\n senders=${lookup mysql{SELECT senders FROM blacklist WHERE senders=&#39;${quote_mysql:$sender_address}&#39; \\\n OR senders=&#39;*@${quote_mysql:$sender_address_domain}&#39; LIMIT 1}}\n\n deny hosts = +spamers\n message = Host rejected by: spamers list on </span><span style=\"color:#FF0000\">rbl.mx2.kyivlink.com</span><span style=\"color:#00FFFF\">.\n\n deny message = Go Away! You are spammer.\n condition = ${if match{$sender_host_name} \\\n {bezeqint\\\\.net|net\\\\.il|dialup|pool|peer|ppp|dhcp} \\\n {yes}{no}}\n\n 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 drop message = Rejected - Sender Verify Failed\n log_message = Rejected - Sender Verify Failed\n !verify = sender/no_details/callout=2m,defer_ok\n !condition = ${if eq{$sender_verify_failure}{}}\n\n .ifdef GREYLIST_ENABLED_GREY\n defer hosts = !+relay_from_hosts\n !authenticated = *\n !senders = : postmaster@* : Mailer-Daemon@*\n acl = greylist_acl\n message = GreyListed: please try again later\n .endif\n\n accept domains = +local_domains\n endpass\n message = unknown user\n verify = recipient\n accept domains = +relay_to_domains\n endpass\n message = Unknown user\n verify = recipient/callout=2m,defer_ok,use_postmaster\n\n accept hosts = +relay_from_hosts\n accept authenticated = *\n deny message = relay not permitted\n\naccept\nacl_check_data:\n .ifdef GREYLIST_ENABLED_GREY\n defer hosts = !+relay_from_hosts\n senders = : postmaster@* : Mailer-Daemon@*\n acl = greylist_acl\n message = GreyListed: please try again later\n .endif\n\ndeny message = This message contains a virus ($malware_name).\n demime = *\n malware = */defer_ok\n\naccept\n\n</span><span style=\"color:#00FF00\">######################################################################\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><span style=\"color:#00FFFF\">\n\nbegin routers\n\ndnslookup:\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\nsystem_aliases:\n driver = redirect\n allow_fail\n allow_defer\n data = ${lookup mysql{SELECT recipients FROM aliases \\\n WHERE (local_part=&#39;${local_part}&#39; AND domain=&#39;${domain}&#39;) \\\n OR (local_part=&#39;*&#39; AND domain=&#39;$domain&#39;)ORDER BY local_part=&#39;*&#39; LIMIT 1}}\n\nvirtual_localuser:\n driver = accept\n domains = ${lookup mysql{SELECT domain from domains WHERE domain=&#39;${domain}&#39;}}\n local_parts = ${lookup mysql{SELECT login from users \\\n WHERE login=&#39;${local_part}&#39; AND domain=&#39;${domain}&#39;}}\n transport = local_delivery\n cannot_route_message = Unknown user\n\n</span><span style=\"color:#00FF00\">######################################################################\n# TRANSPORTS CONFIGURATION #\n######################################################################\n# ORDER DOES NOT MATTER #\n# Only one appropriate transport is called for each delivery. #\n######################################################################</span><span style=\"color:#00FFFF\">\n\nbegin transports\n\nremote_smtp:\n driver = smtp\n interface = </span><span style=\"color:#FF0000\">195.12.59.26</span><span style=\"color:#00FFFF\">\n\nlocal_delivery:\n driver = appendfile\n check_string = &quot;&quot;\n create_directory\n delivery_date_add\n directory = ${lookup mysql{SELECT LOWER(CONCAT(&#39;/var/exim/$domain/&#39;,login)) FROM users \\\n WHERE login=&#39;${local_part}&#39; AND domain=&#39;${domain}&#39;;}}\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=&#39;${local_part}&#39; AND domain=&#39;${domain}&#39;}{${value}M}}\n quota_size_regex = S=(\\d+)$\n quota_warn_threshold = 75%\n return_path_add\n\naddress_pipe:\n driver = pipe\n return_output\n\naddress_file:\n driver = appendfile\n delivery_date_add\n envelope_to_add\n return_path_add\n\naddress_reply:\n driver = autoreply\n\n</span><span style=\"color:#00FF00\">######################################################################\n# RETRY CONFIGURATION #\n######################################################################</span><span style=\"color:#00FFFF\">\n\nbegin retry\n\n* quota\n* * F,2h,15m; G,16h,1h,1.5; F,4d,6h\n\n</span><span style=\"color:#00FF00\">######################################################################\n# REWRITE CONFIGURATION #\n######################################################################</span><span style=\"color:#00FFFF\">\n\nbegin rewrite\n\n</span><span style=\"color:#00FF00\">######################################################################\n# AUTHENTICATION CONFIGURATION #\n######################################################################</span><span style=\"color:#00FFFF\">\n\nbegin authenticators\n\n</span><span style=\"color:#00FF00\"># End of Exim configuration file</span></pre></td>\n</tr>\n</tbody>\n</table>\n<p>Создадим базу данных <strong>MySQL</strong> и пользователя с правами на эту БД:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td>\n<p>mysql&gt; <strong>create database exim;</strong><br />\n Query OK, 1 row affected (0,00 sec)</p>\n<p>mysql&gt; <strong>grant all on exim.* to &#39;exim&#39;@&#39;localhost&#39; identified by &#39;</strong><span style=\"color:#FF0000\"><strong>MYSQL_PASS_HERE</strong></span><strong>&#39;;</strong><br />\n Query OK, 0 rows affected (0,00 sec)</p>\n</td>\n</tr>\n</tbody>\n</table>\n<p>Скачиваем дамп и заливаем его в БД:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>fetch http://muff.kiev.ua/files/exim_mx2.sql</strong><br />\n # <strong>mysql -u exim -p<span style=\"color:#FF0000\">MYSQL_PASS_HERE</span> exim &lt; exim_mx2.sql</strong></td>\n</tr>\n</tbody>\n</table>\n<p class=\"rtejustify\"><span style=\"color:#FF0000\"><strong>Внимание!</strong></span> В моем случае, дамп БД готов для использования. Если же использовать на других серверах, необходимо изменить данные (можно и структуру, например, дефолтные значения) в таблицах <strong>aliases</strong> и <strong>domains</strong>.</p>\n<p class=\"rtejustify\">Запускаем <strong>exim</strong>:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>sh /usr/local/etc/rc.d/exim start</strong></td>\n</tr>\n</tbody>\n</table>\n<p>Проверяем, запустился ли демон:</p>\n<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" style=\"width:100%\">\n<tbody>\n<tr>\n<td># <strong>ps -ax | grep exim</strong><br />\n 70442&nbsp; -&nbsp; Is&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:00,00 /usr/local/sbin/exim -bd -q30m</td>\n</tr>\n</tbody>\n</table>\n<p>Демон запустился. Настройка <strong>Exim</strong> в роли вторичного <strong>mail exchanger (MX)</strong> завершена.</p>\n<p>&nbsp;</p>\n', created = 1767446879, expire = 1767533279, headers = '', serialized = 0 WHERE cid = '2:082cdc8d5ca71b848e95a26f56bce092' 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 = 1767446879, expire = 1767533279, 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 = 1767446879, expire = 1767533279, 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

Exim logo

Переносил вторичный mail exchanger (MX) на новый сервер. Решил выложить инфу и конфиги - еще пригодится...

Исходные данные:

  • Hostname: mx2.kyivlink.com
  • IP: 195.12.59.26
  • Domain: kyivlink.com

Проверяем, куда указывают записи mail exchanger домена kyivlink.com (сервер мультидоменный, но тестировать будем на этом домене):

# host -t mx kyivlink.com
kyivlink.com mail is handled by 10 mail.kyivlink.com.
kyivlink.com mail is handled by 20 mx2.kyivlink.com.

Важно! Необходимо, чтобы "прямая" и "обратная" запись в DNS совпадали. Тоесть в нашем случае, необходимо чтобы запись mx2.kyivlink.com "резолвилась" в IP-адрес 195.12.59.26, а PTR-запись для IP 195.12.59.26 была установлена в mx2.kyivlink.com.

Проверим, выполняются ли эти условия:

# host mx2.kyivlink.com.
mx2.kyivlink.com has address 195.12.59.26

# host 195.12.59.26
26.59.12.195.in-addr.arpa domain name pointer mx2.kyivlink.com.

В DNS-записях все в порядке. Приступим непосредственно к настройке Exim.

Внесем в /etc/make.conf следующий блок:

PORTSDIR?= /usr/ports
# EXIM
.if ${.CURDIR} == ${PORTSDIR}/mail/exim
LOG_FILE_PATH?= syslog
WITH_DEFAULT_CHARSET?= koi8-r
.endif

Виполним установку Exim из системы портов:

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

При сборке указываем необходимость сборки с поддержкой MySQL:

[x] MYSQL              Enable mysql lookups
[x] SPF                Enable Sender Policy Framework checking

По завершению установки выводится список рекомендуемых действий:

To use Exim instead of sendmail on startup:

*) Clear the sendmail queue and stop the sendmail daemon.
*) Adjust mailer.conf(5) as appropriate.
*) Set the 'sendmail_enable' rc.conf(5) variable to 'NONE'.
*) Set the 'daily_status_include_submit_mailq' and
   'daily_clean_hoststat_enable' periodic.conf(5)
   variables to 'NO'.
*) Consider setting 'daily_queuerun_enable' and
   'daily_submit_queuerun' to "NO" in periodic.conf(5),
   if you intend to manage queue runners / deliveries closely.
*) Set the 'exim_enable' rc.conf(5) variable to 'YES'.
*) Start exim with '/usr/local/etc/rc.d/exim start'.

You may also want to configure newsyslog(8) to rotate Exim log files:

/var/log/exim/mainlog   mailnull:mail 640 7 * @T00 ZN
/var/log/exim/rejectlog mailnull:mail 640 7 * @T00 ZN

Относительно настройки ротации логов (в конце рекомендаций) - можно пропустить этот пункт, поскольку в опциях сборки указывали, что логировние будет выполняться с помощью syslog, тоесть логирование будет выполняться в maillog, настройка ротации которого уже выполнена.

А вот остальные рекомендации стоит выполнить.

Останавливаем sendmail и отключаем его поддержку в rc.conf:

# sh /etc/rc.d/sendmail forcestop
# echo '# Disable Sendmail' >> /etc/rc.conf
# echo 'sendmail_enable="NONE"' >> /etc/rc.conf

Файл /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

Настраиваем periodic.conf:

# echo 'daily_status_include_submit_mailq="NO"' >> /etc/periodic.conf
# echo 'daily_clean_hoststat_enable="NO"' >> /etc/periodic.conf
# echo 'daily_queuerun_enable="NO"' >> /etc/periodic.conf
# echo 'daily_submit_queuerun="NO"' >> /etc/periodic.conf

Остается только добавить поддержку Exim в rc.conf и запустить Exim. Однако, предварительно необходимо его настроить.

Отталкиваемся от того, что MySQL и Clamav установлены, настроены и работают.

Отредактируем /usr/local/etc/exim/configure до следующего содержания:

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

GREYLIST_ENABLED_GREY          = yes
GREYLIST_INITIAL_DELAY         = 15 MINUTE
GREYLIST_INITIAL_LIFETIME      = 4 HOUR
GREYLIST_WHITE_LIFETIME        = 12 DAY
GREYLIST_BOUNCE_LIFETIME       = 7 DAY
GREYLIST_RECORD_LIFETIME       = 30 DAY
GREYLIST_TABLE                 = greylist

.ifdef GREYLIST_ENABLED_GREY
   GREYLIST_TEST = SELECT CASE \
   WHEN now() > block_expires THEN "accepted" \
   ELSE "deferred" \
   END AS result, id \
   FROM GREYLIST_TABLE \
   WHERE (now() < record_expires) \
   AND (sender_type = ${if def:sender_address_domain{'NORMAL'}{'BOUNCE'} }) \
   AND (sender = '${quote_mysql:${if def:sender_address_domain{$sender_address_domain}{${domain:$h_from:}} }}') \
   AND (recipient = '${quote_mysql:${if def:domain{$domain}{${domain:$h_to:}} }}') \
   AND (relay_ip = '${quote_mysql:${mask:$sender_host_address/32}}') \
   ORDER BY result DESC LIMIT 1

GREYLIST_ADD = REPLACE INTO GREYLIST_TABLE \
   (relay_ip, sender_type, sender, recipient, block_expires, \
   record_expires, create_time, type) \
   VALUES ( '${quote_mysql:${mask:$sender_host_address/32}}', \
   ${if def:sender_address_domain{'NORMAL'}{'BOUNCE'}}, \
   '${quote_mysql:${if def:sender_address_domain{$sender_address_domain}{${domain:$h_from:}} }}', \
   '${quote_mysql:${if def:domain{$domain}{${domain:$h_to:}} }}', \
   DATE_ADD(now(), INTERVAL GREYLIST_INITIAL_DELAY), \
   DATE_ADD(now(), INTERVAL GREYLIST_INITIAL_LIFETIME), \
   now(), \
   'AUTO' \
    )

   GREYLIST_DEFER_HIT = UPDATE GREYLIST_TABLE \
   SET blockcount=blockcount+1, last_block=now() \
   WHERE id = $acl_m9

   GREYLIST_OK_COUNT = UPDATE GREYLIST_TABLE \
   SET passcount=passcount+1, last_pass=now() \
   WHERE id = $acl_m9

   GREYLIST_OK_NEWTIME = UPDATE GREYLIST_TABLE \
   SET record_expires = DATE_ADD(now(), INTERVAL GREYLIST_WHITE_LIFETIME) \
   WHERE id = $acl_m9 AND type='AUTO'

   GREYLIST_OK_BOUNCE = UPDATE GREYLIST_TABLE \
   SET record_expires = DATE_ADD(now(), INTERVAL GREYLIST_BOUNCE_LIFETIME) \
   WHERE id = $acl_m9 AND type='AUTO'
   GREYLIST_CLEAN = DELETE FROM GREYLIST_TABLE \
   WHERE (DATE_ADD(record_expires, INTERVAL GREYLIST_RECORD_LIFETIME) < now()) AND (type='AUTO')
.endif

primary_hostname = mx2.kyivlink.com

domainlist local_domains = ${lookup mysql{SELECT domain FROM domains \
                        WHERE domain='${domain}' AND \
                        (type='LOCAL' OR type='VIRTUAL')}}

domainlist relay_to_domains = ${lookup mysql{SELECT domain FROM domains \
                        WHERE domain='${domain}' AND type='RELAY'}}

hostlist spamers = ${lookup mysql{SELECT senders FROM blacklist_host WHERE senders='${sender_host_address}'}}

hostlist relay_from_hosts = localhost

auth_advertise_hosts = *
daemon_smtp_ports = 25
log_selector = \
        +all_parents \
        +lost_incoming_connection \
        +received_sender \
        +received_recipients \
        +smtp_confirmation \
        +smtp_syntax_error \
        +smtp_protocol_error \
        -queue_run

acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
av_scanner = clamd:/var/run/clamav/clamd.sock
qualify_domain = mx2.kyivlink.com
local_interfaces = 195.12.59.26

allow_domain_literals = false

exim_user = mailnull
exim_group = mail
never_users = root

host_lookup = *
rfc1413_hosts = *
rfc1413_query_timeout = 5s

syslog_duplication = false

ignore_bounce_errors_after = 5d
timeout_frozen_after = 7d
message_size_limit = 20M
recipients_max = 50
smtp_accept_max = 150
smtp_accept_max_per_connection = 20
smtp_accept_max_per_host = 20
smtp_connect_backlog = 50
smtp_accept_queue_per_connection = 30
split_spool_directory = true
remote_max_parallel = 15
smtp_banner = "MX2.KYIVLINK.COM ESMTP"

hide mysql_servers = localhost/exim/exim/MYSQL_PASS_HERE

######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

begin acl

.ifdef GREYLIST_ENABLED_GREY
 greylist_acl:
 # clean greylist records as 09:3xBRST 10:3xBRDT (horario normal)
  warn  condition  = ${if eq {${substr{8}{4}{$tod_zulu} }} {0100}{yes}{no}}
        set acl_m4 = ${lookup mysql{GREYLIST_CLEAN}}
  # For regular deliveries, check greylist.
  # check greylist tuple, returning "accepted", "deferred" or "unknown"
  # in acl_m8, and the record id in acl_m9

  warn set acl_m8 = ${lookup mysql{GREYLIST_TEST}{$value}{result=unknown}}
       # here acl_m8 = "result=x id=y"

       set acl_m9 = ${extract{id}{$acl_m8}{$value}{-1}}
       # now acl_m9 contains the record id (or -1)

       set acl_m8 = ${extract{result}{$acl_m8}{$value}{unknown}}
       # now acl_m8 contains unknown/deferred/accepted

  # check if we know a certain triple, add and defer message if not
  accept
       # if above check returned unknown (no record yet)
       condition = ${if eq {$acl_m8} {unknown} {1}}
       # then also add a record
       condition = ${lookup mysql{GREYLIST_ADD}{yes}{no}}

  # check if the triple is still blocked
  accept
       # if above check returned deferred then defer
       condition = ${if eq{$acl_m8} {deferred} {1}}
       # and note it down
       condition = ${lookup mysql{GREYLIST_DEFER_HIT}{yes}{yes}}

  # use a warn verb to count records that were hit
  warn condition = ${lookup mysql{GREYLIST_OK_COUNT}}

  # use a warn verb to set a new expire time on automatic records,
  # but only if the mail was not a bounce, otherwise set to now().
  warn !senders = : postmaster@* : Mailer-Daemon@*
       condition = ${lookup mysql{GREYLIST_OK_NEWTIME}}
  warn senders = : postmaster@* : Mailer-Daemon@*
       condition = ${lookup mysql{GREYLIST_OK_BOUNCE}}
  deny
.endif

acl_check_rcpt:
  accept  hosts = +relay_from_hosts

  deny    domains       = +local_domains
            local_parts   = ^[.] : ^.*[@%!/|]

  deny    domains       = !+local_domains
                        local_parts   = ^[./|] : ^.*[@%!] : ^.*/\\.\\./

  accept  local_parts   = postmaster
          domains       = +local_domains

  deny    message       = HELO/EHLO required by SMTP RFC
          condition     = ${if eq{$sender_helo_name}{}{yes}{no}}

# orange.fr war :)
  deny    message         = all email from *.orange.fr - discarded!
          condition       = ${if match{$sender_helo_name}{.orange.fr}{yes}{no}}

# .bezeqint.net
  deny    message         = all email from *.bezeqint.net - discarded!
          condition       = ${if match{$sender_helo_name}{.bezeqint.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}}

# isp.novis.pt
  deny    message         = all email from *.isp.novis.pt - discarded!
          condition       = ${if match{$sender_helo_name}{.isp.novis.pt}{yes}{no}}

  deny   message= Yoy 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}}

  deny    hosts = +spamers
          message       = Host rejected by: spamers list on rbl.mx2.kyivlink.com.

  deny    message       = Go Away! You are spammer.
          condition     = ${if match{$sender_host_name} \
                           {bezeqint\\.net|net\\.il|dialup|pool|peer|ppp|dhcp} \
                          {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

  drop    message     = Rejected - Sender Verify Failed
          log_message = Rejected - Sender Verify Failed
                        !verify = sender/no_details/callout=2m,defer_ok
                        !condition =  ${if eq{$sender_verify_failure}{}}

   .ifdef GREYLIST_ENABLED_GREY
    defer hosts         = !+relay_from_hosts
         !authenticated = *
         !senders       = : postmaster@* : Mailer-Daemon@*
         acl            = greylist_acl
         message        = GreyListed: please try again later
   .endif

  accept  domains       = +local_domains
          endpass
          message       = unknown user
          verify        = recipient
  accept  domains       = +relay_to_domains
          endpass
          message       = Unknown user
          verify        = recipient/callout=2m,defer_ok,use_postmaster

  accept  hosts         = +relay_from_hosts
  accept  authenticated = *
  deny    message       = relay not permitted

accept
acl_check_data:
  .ifdef GREYLIST_ENABLED_GREY
    defer hosts         = !+relay_from_hosts
        senders         = : postmaster@* : Mailer-Daemon@*
        acl             = greylist_acl
        message         = GreyListed: please try again later
  .endif

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

dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

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}}

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 = 195.12.59.26

local_delivery:
  driver = appendfile
  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 = 75%
  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

######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################

begin retry

*                      quota
*                      *           F,2h,15m; G,16h,1h,1.5; F,4d,6h

######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################

begin rewrite

######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################

begin authenticators

# 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, 0 rows affected (0,00 sec)

Скачиваем дамп и заливаем его в БД:

# fetch http://muff.kiev.ua/files/exim_mx2.sql
# mysql -u exim -pMYSQL_PASS_HERE exim < exim_mx2.sql

Внимание! В моем случае, дамп БД готов для использования. Если же использовать на других серверах, необходимо изменить данные (можно и структуру, например, дефолтные значения) в таблицах aliases и domains.

Запускаем exim:

# sh /usr/local/etc/rc.d/exim start

Проверяем, запустился ли демон:

# ps -ax | grep exim
70442  -  Is        0:00,00 /usr/local/sbin/exim -bd -q30m

Демон запустился. Настройка Exim в роли вторичного mail exchanger (MX) завершена.

 

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

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

Литература

Кoмпьютер пoзвoляет решать все те прoблемы, кoтoрые дo изoбретения кoмпьютера не существoвали.