{"id":5989,"date":"2022-09-09T18:09:07","date_gmt":"2022-09-09T15:09:07","guid":{"rendered":"https:\/\/skeletor.org.ua\/?p=5989"},"modified":"2024-03-27T11:39:30","modified_gmt":"2024-03-27T09:39:30","slug":"exim-postfixadmin-%d0%b2%d0%b8%d0%ba%d0%be%d1%80%d0%b8%d1%81%d1%82%d0%be%d0%b2%d1%83%d1%94%d0%bc%d0%be-%d0%ba%d0%b2%d0%be%d1%82%d0%b8-%d0%b4%d0%bb%d1%8f-%d1%86%d1%96%d0%bb%d0%be%d0%b3%d0%be-%d0%b4","status":"publish","type":"post","link":"https:\/\/skeletor.org.ua\/?p=5989","title":{"rendered":"[exim] postfixadmin: \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0454\u043c\u043e \u043a\u0432\u043e\u0442\u0438 \u0434\u043b\u044f \u0446\u0456\u043b\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0443."},"content":{"rendered":"\n<p>\u041e\u0434\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0449\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0440\u0456\u0448\u0435\u043d\u043d\u044f \u0441\u0430\u043c\u0435 \u043f\u043e \u043a\u0432\u043e\u0442\u0430\u043c \u0434\u043b\u044f \u0446\u0456\u043b\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0443 \u044f \u043d\u0435 \u0437\u043d\u0430\u0439\u0448\u043e\u0432, \u0442\u043e\u043c\u0443 \u0437\u0440\u043e\u0431\u0438\u0432 \u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 <strong>workaround&#8217;\u0456\u0432<\/strong>. \u042f \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u044e \u0437\u0432\u02bc\u044f\u0437\u043a\u0443 exim <strong>(+dovecot delivery) + dovecot + postfixadmin<\/strong>.<\/p>\n\n\n\n<p><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#cb5511\" class=\"has-inline-color\">postfixadmin<\/mark><\/em><\/strong><\/p>\n\n\n\n<p>\u0422\u0443\u0442 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043d\u044c\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u043c\u0438\u043a\u0430\u0454\u043c\u043e \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0443 \u043a\u0432\u043e\u0442 \u0432 \u043a\u043e\u043d\u0444\u0456\u0433\u0443:<\/p>\n\n\n<pre>$CONF['quota'] = 'YES';\n$CONF['domain_quota'] = 'YES';\n<\/pre>\n<p><!--more--><\/p>\n\n\n<p><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#cb5511\" class=\"has-inline-color\">dovecot<\/mark><\/em><\/strong><\/p>\n\n\n\n<p>\u0412 \u043a\u043e\u043d\u0444\u0456\u0433 <strong>dovecot.conf <\/strong>\u0434\u043e\u0434\u0430\u0454\u043c\u043e \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u043d\u0456 \u0441\u0435\u043a\u0446\u0456\u0457\u0457:<\/p>\n\n\n<pre>mail_plugins=$mail_plugins quota\n\nprotocol lda {\n    mail_plugins = $mail_plugins quota\n...\n}\n\nprotocol imap {\n    mail_plugins = $mail_plugins imap_quota\n}\n\nservice dict {\n  unix_listener dict {\n    mode = 0660\n    user = dovecot\n    group = Debian-exim\n  }\n}\n\ndict {\n        sqluserquota = mysql:\/etc\/dovecot\/dovecot-dict-sql-quota-user.conf\n}\n\nplugin {\n        quota = dict:User Quota::proxy::sqluserquota\n        quota_warning = storage=100%% quota-exceeded 100 %d\n}\n<\/pre>\n\n\n<p>\u041f\u043e\u044f\u0441\u043d\u044e \u0434\u0435\u0449\u043e. \u041f\u043e \u0441\u0443\u0442\u0456, \u043f\u0440\u0430\u0446\u044e\u044e\u0442\u044c \u0442\u0456\u043b\u044c\u043a\u0438 \u043a\u0432\u043e\u0442\u0438 \u0434\u043b\u044f \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432, \u044f\u043a\u0456 \u043e\u043f\u0438\u0441\u0443\u044e\u0442\u044c\u0441\u044f \u0432 <strong>\/etc\/dovecot\/dovecot-dict-sql-quota-user.conf<\/strong>, \u0442\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0443\u0454\u043c\u043e \u043b\u0438\u0448\u0435 \u0457\u0445:<\/p>\n\n\n<pre>dovecot-dict-sql-quota-user.conf:\n\nconnect = host=\/run\/mysqld\/mysqld.sock user=mail password=pass dbname=postfixadmin\nmap {\n  pattern = priv\/quota\/storage\n  table = quota2\n  username_field = username\n  value_field = bytes\n}\nmap {\n  pattern = priv\/quota\/messages\n  table = quota2\n  username_field = username\n  value_field = messages\n}\n<\/pre>\n\n\n<p>\u0422\u0443\u0442 \u043c\u0438 \u043e\u043f\u0438\u0441\u0443\u0454\u043c\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0456, \u0432 \u044f\u043a\u0438\u0445 \u0431\u0443\u0434\u0443\u0442\u044c \u0437\u0431\u0435\u0440\u0456\u0433\u0430\u0442\u0438\u0441\u044f \u043a\u0432\u043e\u0442\u0438. \u042f\u043a \u043e\u043d\u043e\u0432\u043b\u044e\u044e\u0442\u044c\u0441\u044f \u043a\u0432\u043e\u0442\u0438? dovecot (\u044f\u043a\u0449\u043e \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u0441\u0430\u043c\u0435 <strong>dovecot delivery<\/strong>) \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0456 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 (\u0432\u0445\u043e\u0434\u0456 \u0434\u043e \u0441\u043a\u0440\u0438\u043d\u044c\u043a\u0438 \u0447\u0438 \u043e\u0442\u0440\u0438\u043c\u0430\u043d\u043d\u0456 \u043b\u0438\u0441\u0442\u0430) \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043f\u0456\u0434\u0440\u0430\u0445\u043e\u0432\u0443\u0454 \u0440\u043e\u0437\u043c\u0456\u0440 \u043f\u043e\u0448\u0442\u043e\u0432\u043e\u0457 \u0441\u043a\u0440\u0438\u043d\u044c\u043a\u0438 \u0456 \u0441\u043a\u043b\u0430\u0434\u0430\u0454 \u0446\u0456 \u0434\u0430\u043d\u0456 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044e. \u0412 \u0434\u0430\u043d\u043e\u043c\u0443 \u0432\u0438\u043f\u0430\u0434\u043a\u0443 \u0446\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044f <strong>quote2<\/strong>. <\/p>\n\n\n\n<p><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#cb5511\" class=\"has-inline-color\">mysql<\/mark><\/em><\/strong><\/p>\n\n\n\n<p>\u0414\u0430\u043d\u0456 \u043f\u0440\u043e \u0440\u043e\u0437\u043c\u0456\u0440 \u0434\u043b\u044f \u0432\u0441\u044c\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0443 \u0431\u0443\u0434\u0435\u043c\u043e \u043f\u0456\u0434\u0440\u0430\u0445\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u043e\u043a\u0440\u0435\u043c\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c, \u044f\u043a\u0438\u0439 \u0431\u0443\u0434\u0435 \u0441\u043a\u043b\u0430\u0434\u0430\u0442\u0438 \u043e\u043d\u043e\u0432\u043b\u0435\u043d\u0456 \u0434\u0430\u043d\u0456 \u0432 \u0456\u043d\u0448\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044e <strong>exim_quota<\/strong>. \u0421\u0442\u0432\u043e\u0440\u0438\u043c\u043e \u0457\u0457:<\/p>\n\n\n<pre>mysql&gt;CREATE TABLE `exim_quota` (\n  `domain` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL,\n  `quota` bigint NOT NULL DEFAULT '0',\n  `overlimit` tinyint(1) NOT NULL DEFAULT '0',\n  PRIMARY KEY (`domain`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci\n<\/pre>\n\n\n<p>\u0422\u0430\u0431\u043b\u0438\u0446\u044f \u043c\u0456\u0441\u0442\u0438\u0442\u044c \u0442\u0430\u043a\u0456 \u0441\u0442\u043e\u0432\u043f\u0446\u0456: \u0434\u043e\u043c\u0435\u043d, \u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439 \u043e\u0431\u02bc\u0454\u043c \u0456 <strong>overlimit<\/strong>, \u044f\u043a\u0438\u0439 \u0432\u0438\u0437\u043d\u0430\u0447\u0430\u0454, \u0447\u0438 \u043f\u0435\u0440\u0435\u0432\u0438\u0449\u0435\u043d\u0438\u0439 (\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f &#8220;1&#8221;) \u043b\u0456\u043c\u0456\u0442, \u0447\u0438 &#8211; \u043d\u0456 (\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044f &#8220;0&#8221;).<\/p>\n\n\n\n<p>\u0422\u0440\u0435\u0431\u0430 \u0432\u0438\u0434\u0430\u0442\u0438 \u043f\u0440\u0430\u0432\u0430 \u0434\u043b\u044f \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0430 <strong>mail@localhost<\/strong> (\u0432\u0456\u0434 \u044f\u043a\u043e\u0433\u043e \u043f\u0440\u0430\u0446\u044e\u0454 dovecot), \u0449\u043e\u0431 <strong>dovecot <\/strong>\u043c\u0456\u0433 \u043e\u043d\u043e\u0432\u043b\u044e\u0432\u0430\u0442\u0438 \u043a\u0432\u043e\u0442\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044f\u0445:<\/p>\n\n\n<pre>mysql&gt;GRANT INSERT, UPDATE, DELETE ON `postfixadmin`.`quota2` TO `mail`@`localhost`;\nmysql&gt;GRANT INSERT, UPDATE, DELETE ON `postfixadmin`.`quota` TO `mail`@`localhost`;\n<\/pre>\n\n\n<p><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#cb5511\" class=\"has-inline-color\">exim<\/mark><\/em><\/strong><\/p>\n\n\n<pre>acl_smtp_mail = acl_check_mail\nacl_smtp_rcpt = acl_check_rcpt\n...\nacl_check_mail:\n...\n  deny   log_message    = \"Quota for outgoing domain &lt;$sender_address_domain&gt; exceeded\"\n         message        = \"Quota for outgoing domain &lt;$sender_address_domain&gt; exceeded\"\n         sender_domains = ${lookup mysql{SELECT `domain` FROM `exim_quota` WHERE `domain` = '${quote_mysql:$sender_address_domain}' AND overlimit = '1'}}\n...\nacl_check_rcpt:\n...\n  deny   log_message    = \"Quota for incoming domain &lt;$domain&gt; exceeded\"\n         message        = \"Quota for outgoing domain &lt;$domain&gt; exceeded\"\n         domains        = ${lookup mysql{SELECT `domain` FROM `exim_quota` WHERE `domain` = '${quote_mysql:$domain}' AND overlimit = '1'}}\n<\/pre>\n\n\n<p>\u0414\u043e\u0434\u0430\u0454\u043c\u043e \u043f\u0435\u0440\u0435\u0432\u0456\u0440\u043a\u0443 \u043d\u0430 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u0430\u043d\u043d\u044f \u043a\u0432\u043e\u0442 \u0434\u043b\u044f \u0432\u0438\u0445\u0456\u0434\u043d\u043e\u0457 \u043f\u043e\u0448\u0442\u0438 (<strong>acl_check_mail<\/strong>) \u0456 \u0432\u0445\u0456\u0434\u043d\u043e\u0457 (<strong>acl_check_rcpt<\/strong>). \u041b\u043e\u0433\u0456\u043a\u0430 \u0442\u0430\u043a\u0430: \u044f\u043a\u0449\u043e \u0437\u0430\u043f\u0438\u0442 <strong>mysql <\/strong>\u043f\u043e\u0432\u0435\u0440\u0442\u0430\u0454 \u0434\u043e\u043c\u0435\u043d, \u0442\u043e \u0437\u0430\u0441\u0442\u043e\u0441\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0456\u0442\u0438\u043a\u0430 <strong>deny<\/strong>. \u042f\u043a\u0449\u043e \u043d\u0456\u0447\u043e\u0433\u043e \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u0442\u0430\u0454\u0442\u044c\u0441\u044f, \u0442\u043e \u043f\u043e\u043b\u0456\u0442\u0438\u043a\u0430 \u043d\u0435 \u0437\u0430\u0441\u0442\u043e\u0441\u043e\u0432\u0443\u0454\u0442\u044c\u0441\u044f. \u0422\u043e\u0431\u0442\u043e, <strong>exim <\/strong>\u043b\u0438\u0448\u0435 \u043f\u0435\u0440\u0435\u0432\u0456\u0440\u044f\u0454 \u043f\u043e\u043b\u0435 <strong>overlimit<\/strong>. \u0414\u0430\u043d\u0456 \u0432 \u0446\u044c\u043e\u043c\u0443 \u043f\u043e\u043b\u0456 \u043e\u043d\u043e\u0432\u043b\u044e\u0454 \u0441\u043f\u0435\u0446\u0456\u0430\u043b\u044c\u043d\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u0449\u043e\u0431 \u043f\u0440\u0438 \u043a\u043e\u0436\u043d\u043e\u043c\u0443 \u043b\u0438\u0441\u0442\u0456 \u043d\u0435 \u0442\u0440\u0435\u0431\u0430 \u0431\u0443\u043b\u043e \u043f\u0456\u0434\u0440\u0430\u0445\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u0437\u0430\u043d\u043e\u0432\u043e \u043a\u0432\u043e\u0442\u0443 \u0434\u043b\u044f \u0432\u0441\u0456\u0445 \u0434\u043e\u043c\u0435\u043d\u0456\u0432.<\/p>\n\n\n<p>\u0414\u043b\u044f <strong>debug&#8217;u ACL<\/strong> \u043c\u043e\u0436\u043d\u0430 \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u0432\u0430\u0442\u0438 \u0442\u0430\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434:<\/p>\n\n\n<p><code>#exim -v -d-all+acl -bhc 1.1.1.1<\/code><\/p>\n\n\n<p>\u0456 \u0434\u0430\u043b\u0456 \u044f\u043a \u0437\u0456 \u0437\u0432\u0438\u0447\u0430\u0439\u043d\u0438\u043c <strong>telnet smtp<\/strong> \u0432\u0432\u043e\u0434\u0438\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0438, <strong>ehlo<\/strong>, <strong>mail from<\/strong>, <strong>rctp to<\/strong>,&#8230;<\/p>\n\n\n<p><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#cb5511\" class=\"has-inline-color\">script<\/mark><\/em><\/strong><\/p>\n\n\n<pre>#!\/bin\/bash\n\nMYSQL=\/usr\/bin\/mysql\n\nmysql_db=postfixadmin\n\nbuff=`$MYSQL --login-path=postfixadmin -N -e \"select domain, quota from domain where domain &lt;&gt; 'ALL' and active = '1';\" $mysql_db`\n\nwhile read line\ndo\n        domain=`echo \"${line}\"|awk '{print $1}'`\n        quota=`echo \"${line}\"|awk '{print $2}'`\n        check=`echo \"SELECT domain FROM domain WHERE (SELECT SUM(bytes)\/1048576 FROM quota2 WHERE username LIKE '%@$domain') &gt; '$quota' AND domain = '$domain';\" | $MYSQL --login-path=postfixadmin -N $mysql_db`\n\n        if [ -z \"$check\" ]\n        then\n                overlimit=0\n        else\n                overlimit=1\n        fi\n\n        echo \"INSERT INTO exim_quota (domain,quota,overlimit) VALUES ('$domain','$quota','$overlimit') ON DUPLICATE KEY UPDATE quota=values(quota), overlimit=values(overlimit);\" | $MYSQL --login-path=postfixadmin -N $mysql_db\ndone &lt;&lt;&lt; \"$buff\"\n<\/pre>\n\n\n<p>\u0419\u043e\u0433\u043e \u0442\u0440\u0435\u0431\u0430 \u0434\u043e\u0434\u0430\u0442\u0438 \u0432 cron (\u0440\u0430\u0437 \u043d\u0430 \u0445\u0432\u0438\u043b\u0438\u043d\u0443). \u0417\u0432\u0438\u0447\u0430\u0439\u043d\u043e, \u043f\u043e\u0442\u0440\u0456\u0431\u043d\u0456 \u0432\u0456\u0434\u043f\u043e\u0432\u0456\u0434\u043d\u0456 \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0446\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044e.<\/p>\n\n\n\n<p><strong><em><mark style=\"background-color:rgba(0, 0, 0, 0);color:#cb5511\" class=\"has-inline-color\">\u041d\u044e\u0430\u043d\u0441\u0438.<\/mark><\/em><\/strong><\/p>\n\n\n\n<p>\u041a\u0432\u043e\u0442\u0438 \u043f\u043e\u0447\u0438\u043d\u0430\u044e\u0442\u044c \u0440\u0430\u0445\u0443\u0432\u0430\u0442\u0438\u0441\u044f \u043b\u0438\u0448\u0435 \u0437 \u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0443, \u0437 \u044f\u043a\u043e\u0433\u043e \u0432\u0438 \u0457\u0445 \u043d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043b\u0438. \u0422\u043e\u0431\u0442\u043e, \u043f\u043e\u043a\u0438 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0443 \u043d\u0435 \u043f\u0440\u0438\u0439\u0434\u0435 \u043d\u043e\u0432\u0438\u0439 \u043b\u0438\u0441\u0442 \u0447\u0438 \u0432\u0456\u043d \u043d\u0435 \u0432\u0432\u0456\u0439\u0434\u0435 \u0443 \u0441\u043a\u0440\u0438\u043d\u044c\u043a\u0443, \u0432\u0456\u043d \u043d\u0435 \u0431\u0443\u0434\u0435 \u0432\u0440\u0430\u0445\u043e\u0432\u0430\u043d\u0438\u0439. \u042f\u043a \u0431\u0443\u0442\u0438? \u0422\u0440\u0435\u0431\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 \u043f\u0440\u0438\u043c\u0443\u0441\u043e\u0432\u0438\u0439 \u043f\u0435\u0440\u0435\u0440\u0430\u0445\u0443\u043d\u043e\u043a \u0434\u043b\u044f \u0432\u0441\u0456\u0445 \u043a\u043e\u0440\u0438\u0441\u0442\u0443\u0432\u0430\u0447\u0456\u0432. \u041e\u0441\u044c, \u044f\u043a \u0446\u0435 \u043c\u043e\u0436\u043d\u0430 \u0437\u0440\u043e\u0431\u0438\u0442\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0443:<\/p>\n\n\n\n<p><code># doveadm -Dv quota recalc -u *@domain.ua<\/code><\/p>\n\n\n\n<p>\u042f\u043a\u0449\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043e\u0442\u0440\u0438\u043c\u0430\u043b\u0438 \u043f\u043e\u043c\u0438\u043b\u043a\u0443:<\/p>\n\n\n\n<p><code>Error: auth-master: userdb list: User listing returned failure<\/code><\/p>\n\n\n\n<p>\u0442\u043e \u0442\u0440\u0435\u0431\u0430 \u0434\u043e\u0434\u0430\u0442\u0438 \u0442\u0430\u043a\u0438\u0439 \u0440\u044f\u0434\u043e\u043a \u0434\u043e \u0444\u0430\u0439\u043b\u0443 <strong>dovecot-sql.conf<\/strong> (\u0430\u0431\u043e \u0442\u043e\u0433\u043e, \u0434\u0435 \u0443 \u0432\u0430\u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u0434\u043b <strong>mysql <\/strong>\u0432 <strong>dovecot<\/strong>) \u0456 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0438 <strong>dovecot <\/strong>\u0456 \u043f\u043e\u0442\u0456\u043c \u0437\u0430\u043d\u043e\u0432\u043e <strong>doveadm<\/strong>&#8230;:<\/p>\n\n\n\n<p><code>iterate_query = SELECT username AS user FROM mailbox<\/code><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041e\u0434\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0449\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0438\u0440\u0456\u0448\u0435\u043d\u043d\u044f \u0441\u0430\u043c\u0435 \u043f\u043e \u043a\u0432\u043e\u0442\u0430\u043c \u0434\u043b\u044f \u0446\u0456\u043b\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0443 \u044f \u043d\u0435 \u0437\u043d\u0430\u0439\u0448\u043e\u0432, \u0442\u043e\u043c\u0443 \u0437\u0440\u043e\u0431\u0438\u0432 \u0434\u0435\u043a\u0456\u043b\u044c\u043a\u0430 workaround&#8217;\u0456\u0432. \u042f \u0432\u0438\u043a\u043e\u0440\u0438\u0441\u0442\u043e\u0432\u0443\u044e \u0437\u0432\u02bc\u044f\u0437\u043a\u0443 exim (+dovecot delivery) + dovecot + postfixadmin. postfixadmin \u0422\u0443\u0442 \u0432\u0441\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043d\u044c\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u0412\u043c\u0438\u043a\u0430\u0454\u043c\u043e \u043f\u0456\u0434\u0442\u0440\u0438\u043c\u043a\u0443 \u043a\u0432\u043e\u0442 \u0432 \u043a\u043e\u043d\u0444\u0456\u0433\u0443: $CONF[&#8216;quota&#8217;] = &#8216;YES&#8217;; $CONF[&#8216;domain_quota&#8217;] = &#8216;YES&#8217;;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-5989","post","type-post","status-publish","format-standard","hentry","category-mail"],"_links":{"self":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/5989","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5989"}],"version-history":[{"count":2,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/5989\/revisions"}],"predecessor-version":[{"id":6363,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=\/wp\/v2\/posts\/5989\/revisions\/6363"}],"wp:attachment":[{"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5989"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5989"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/skeletor.org.ua\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5989"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}